簡體   English   中英

誰能解釋以下代碼輸出?

[英]Can anyone explain the following output of the code?

嗨,我是C編程語言的新手,在變量部分的數據類型中,char是1個字節,只能容納一個字符,而int是4個字節,它可以容納-21474836482147483647的范圍。 因此,我嘗試破壞以下程序的大小。

#include <stdio.h>

int main() {
    int num = 2147483700;
    printf("%d", num);

    return 0;
}

輸出:-

-2147483596

我預計會收到與尺寸有關的錯誤消息。

這是超出范圍轉換的結果。 在這種情況下,試圖以存儲值出的范圍的intint 因為int是帶符號的,所以轉換以實現定義的方式發生。

在使用負數的二進制補碼表示的系統上,這通常意味着該值回繞,這就是您在此處看到的內容。

編譯器不需要在發生這種情況時發出警告,但如果願意,則可以發出警告。 例如,gcc不會使用-Wall -Wextra警告,但會使用-Wconversion警告。

此行為在C標准的 6.3.1.8節中進行了記錄,有關整數轉換:

1將整數類型的值轉換為_Bool以外的其他整數類型時,如果該值可以用新類型表示,則該值不變。

2否則,如果新類型是無符號的,則通過重復添加或減去比新類型可表示的最大值多一個值來轉換值,直到該值在新類型的范圍內為止。

3 否則,將對新類型進行簽名,並且無法在其中表示值; 結果是實現定義的,還是引發實現定義的信號。

由於歷史原因,C編譯器默認情況下非常寬容,可以接受愚蠢的錯誤而不會閃爍。

最好向編譯器詢問其他警告,並使用-Wall -Werror或更嚴格的設置(例如gcc -Wextraclang -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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM