我不明白為什么從 LONG_MAX、LONG_MIN 和 UINT_MAX 回傳這些奇怪的值。此外,由于我正在關注“C 編程語言”一書,我注意到我的 pc 中 int 范圍的值恰好是書中的 long 值之一。這甚至可能嗎?
源代碼:
int main(){
printf(" [INT]\t|%d | %d|\n", INT_MAX, INT_MIN);
printf("[UINT]\t|d| d|\n", UINT_MAX);
printf("[SHRT]\t|d| d|\n", SHRT_MAX, SHRT_MIN);
printf("[LONG]\t|d| d|\n", LONG_MAX, LONG_MIN);
}
輸出:
[INT] |2147483647 | -2147483648|
[UINT] | -1| 0|
[SHRT] | 32767| -32768|
[LONG] | -1| 0|
uj5u.com熱心網友回復:
LONG_MAX并且LONG_MIN應該使用%ld(或ld類似方式)列印,因為它們的型別是long. 當它們用 列印時%d,行為不是由 C 標準定義的,程式可能會以各種方式出現錯誤行為。
UINT_MAX應該使用%u(或u類似)列印,因為它的型別是unsigned int.
此外,printf("[UINT]\t|d| d|\n", UINT_MAX);有兩個轉換規范,但只提供了一個值。添加另一個引數,或洗掉第二個轉換規范。
uj5u.com熱心網友回復:
該值不正確UINT_MAX,LONG_MAX和LONG_MIN。其他是正確的(有符號整數的最大值和最小值)。
UINT_MAXlimits.h大致定義在(或它包含的另一個頭檔案中)如下:
#define UINT_MAX 4294967295
它由 C 前處理器處理。實際上,任何時候如果您在 C 代碼中使用 UINT_MAX,都會將 4294967295 作為字串替換其中。
因此,您的相關代碼行將被預處理為
printf("[UINT]\t|d| d|\n", 4294967295, 0);
如果沒有其他建議,這個大的 4294967295 將被解釋為一個有符號整數。但是對于有符號整數來說太大了,因為它們的最大值約為 20 億。這會導致整數溢位錯誤(標準稱之為“未定義行為”左右,但我們的語言律師可能會很快糾正我)。但是 4294967295 的位域(解釋為有符號整數)正好是 -1。
最簡單的解決方法是建議編譯器將變數解釋為無符號整數,大致如下:
printf("[UINT]\t|d| d|\n", 4294967295UL, 0);
這仍然不行,因為%d需要一個有符號整數,所以還要修復格式化字串。可能%D或%Ld將是您需要的,檢查檔案并打開所有警告。
因為 C (故意)在型別檢查方面很弱,所以最好打開所有可能的警告(在 gcc 中,-Wall標志)并撰寫始終干凈、無警告的代碼。如果代碼不是完全沒有警告的,甚至不要嘗試啟動它 - 解決警告比解決神秘的錯誤要容易得多。
Ps 理論上,C 標準沒有描述整數型別的位長,甚至可能沒有描述它們的位級表示,因此圍繞這個主題可能會有大量的語言律師,而且它很可能會發生。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/367258.html
標籤:C
