[英]Can anyone explain the following output of the code?
嗨,我是C編程語言的新手,在變量部分的數據類型中,char是1個字節,只能容納一個字符,而int是4個字節,它可以容納-2147483648
至2147483647
的范圍。 因此,我嘗試破壞以下程序的大小。
#include <stdio.h>
int main() {
int num = 2147483700;
printf("%d", num);
return 0;
}
輸出:-
-2147483596
我預計會收到與尺寸有關的錯誤消息。
這是超出范圍轉換的結果。 在這種情況下,試圖以存儲值出的范圍的int
在int
。 因為int
是帶符號的,所以轉換以實現定義的方式發生。
在使用負數的二進制補碼表示的系統上,這通常意味着該值回繞,這就是您在此處看到的內容。
編譯器不需要在發生這種情況時發出警告,但如果願意,則可以發出警告。 例如,gcc不會使用-Wall -Wextra
警告,但會使用-Wconversion
警告。
此行為在C標准的 6.3.1.8節中進行了記錄,有關整數轉換:
1將整數類型的值轉換為_Bool以外的其他整數類型時,如果該值可以用新類型表示,則該值不變。
2否則,如果新類型是無符號的,則通過重復添加或減去比新類型可表示的最大值多一個值來轉換值,直到該值在新類型的范圍內為止。
3 否則,將對新類型進行簽名,並且無法在其中表示值; 結果是實現定義的,還是引發實現定義的信號。
由於歷史原因,C編譯器默認情況下非常寬容,可以接受愚蠢的錯誤而不會閃爍。
最好向編譯器詢問其他警告,並使用-Wall -Werror
或更嚴格的設置(例如gcc -Wextra
或clang -Weverything
產生這些錯誤。
這是我的蹤跡:
chqrlie$ clang -Wall -Werror overf.c
overf.c:4:15: error: implicit conversion from 'long' to 'int' changes value from 2147483700 to -2147483596 [-Werror,-Wconstant-conversion]
int num = 2147483700;
~~~ ^~~~~~~~~~
1 error generated.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.