Die Regeln der ganzzahlige Konstante in C ist, dass eine dezimale ganzzahlige Konstante des ersten Typs hat, in der sie in dargestellt werden: int
, long
, long long
.
2147483648
paßt nicht in ein int
in dem System (wie die maximalen int
in dem System ist 2147483647
) so seine Art ist ein long
(oder ein long long
auf dem System abhängig). Sie berechnen also sizeof (long)
(oder sizeof (long long)
abhängig von Ihrem System).
2147483647
ist ein int
in Ihrem System, und wenn Sie 1
zu einem int
hinzuzufügen, ist es immer noch ein int
. Sie berechnen also sizeof (int)
.
Beachten Sie, dass sizeof(2147483647+1)
in Ihrem System als INT_MAX + 1
überlaufen undefiniertes Verhalten aufruft und signierte Integerüberläufe sind nicht definiertes Verhalten in C.
Beachten Sie, dass während in der Regel 2147483647+1
ruft nicht definiertes Verhalten in Ihrem System (INT_MAX + 1
Überflutung und Signed Integer Überlauf ist undefiniertes Verhalten in C), sizeof(2147483647+1)
ruft kein undefiniertes Verhalten auf, da der Operand sizeof
in diesem Fall nicht ausgewertet wird.
Warum machst du das in erster Linie –
mögliche Duplikat von [Warum ist "int i = 2147483647 + 1;" OK, aber "Byte b = 127 + 1;" ist nicht kompilierbar?] (http://stackoverflow.com/questions/6889176/why-is-int-i-2147483647-1-ok-but-byte-b-127-1-is-not-compilable) – GSerg
' 2147483647 + 1 'ist ein Ausdruck, der zwei 'int' Operanden aufweist, so ist das Ergebnis ein' int' (und hat wegen des Überlaufverhaltens nicht definiert). Ähnlich ist "-2147483648" ein Ausdruck, bei dem "2147483648" ein "langer int" ist, auf den dann der unäre Minusoperator angewendet wird. –