2015-06-21 12 views
14
#include<stdio.h> 

int main() 
{ 
    printf("%d\n", sizeof(2147483648)); 
    printf("%d" , sizeof(2147483647+1)); 
    return 0; 
} 

Output:sizeof (2147483648) ist 8 Bytes während sizeof (2147483647 + 1) 4 Bytes ist

8 
4 

Ich verstehe, dass sizeof(2147483648) 8 Bytes ist, da es nicht in 4 Bytes passen und wird gefördert long long int. Aber ich verstehe nicht, was passiert im Fall von sizeof(2147483647+1)

Ich fand eine similar question, aber es diskutiert nicht den zweiten Fall.

+3

Warum machst du das in erster Linie –

+0

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

+10

' 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. –

Antwort

18

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.

+2

Sind Sie sicher, dass hier ein undefiniertes Verhalten vorliegt, da der Ausdruck als Argument für "sizeof" und nicht in einem Kontext erscheint, in dem er ausgewertet würde? – Hurkyl

+3

Ich vermute, dass es UB aufrufen wird. '2147483647 + 1' wird nicht ausgewertet. – haccks

+1

Möglicherweise relevant: [Wird der Ausdruck, auf den sizeof angewendet wird, nicht für die Dereferenzierung eines Null- oder ungültigen Zeigers in sizeof in C++ verwendet?] (http://stackoverflow.com/q/28714018/11683). – GSerg

Verwandte Themen