Ich versuche Gleichheit und ohne Vorzeichen Versionen von short, int und lange in C. Insbesondere zu testen, habe ich den folgenden Testcode verwendet:inkonsistent Gleichheit und ohne Vorzeichen nach Überlauf in C
#include <stdio.h>
int main() {
signed short ss = 0x8000; // 2^15
unsigned short us = 0x8000;
printf("ss = %i, us = %i\n", ss, us);
if (ss == us) { printf("ss == us\n"); }
else { printf("ss != us\n"); }
signed int si = 0x80000000; // 2^31
unsigned int ui = 0x80000000;
printf("si = %i, ui = %i\n", si, ui);
if (si == ui) { printf("si == ui\n"); }
else { printf("si != ui\n"); }
signed long sl = 0x8000000000000000L; // 2^63
unsigned long ul = 0x8000000000000000UL; // 2^63
printf("sl = %li, ul = %lu\n", sl, ul);
if (sl == ul) { printf("si == ui\n"); }
else { printf("sl != ul\n"); }
}
der Code gibt der folgende:
ss = -32768, us = 32768
ss != us
si = -2147483648, ui = -2147483648
si == ui
sl = -9223372036854775808, ul = 9223372036854775808
si == ui
Also für Shorts sie nicht gleich sind, sondern auch für die beiden anderen sind sie. Ist etwas nicht in Ordnung mit dem, was ich annehme, oder ist das nur eine bekannte Eigenart von C?
Das ist keine Eigenart, sondern Standardverhalten. – Olaf
In den 'printf'-Anweisungen wird nicht wie in' Like 'verglichen: In den ersten beiden (aber nicht im dritten Beispiel) verwenden Sie '% i' (signed int) sowohl für die vorzeichenbehafteten als auch die vorzeichenlosen Werte, die die Daten ausgeben auf den Stapel gelegt, wie es gesagt wird. Sobald es dort ist, gibt es keine Möglichkeit zu sagen, ob sie signiert oder nicht signiert sind, abgesehen von ihrem Kontext. Im Fall der 'short' werden die Werte vor dem Platzieren auf dem Stapel zu 'signed int' und 'unsigned int' (wegen des Variablentyps) hochgestuft und dann wegen des'% ich bin Spezifizierer. –