2013-07-27 47 views
2

我剛剛開始閱讀ISO C 2011標準,以及它的最後一個公開草案[1],並且意識到在C詞法分析器[1] [458ff。]中,所有(字面)數字常量都是無符號。ISO C和帶符號立即數常量

這是否意味着編譯器將有符號數值常量(如-5.1E10或-1) 解釋爲相應一元運算符的調用? 例如-1 < => - (1),512 < => +(512)

UPDATE: 我的故障, 「所有(文字)的數值常數是無符號的」 我的意思是「所有(文字)的數值常量是非負」

方面,托馬斯

回答

3

所有非後綴十進制整數文字都有符號,但不能是負數。也許非負面的是你的意思是「無符號」,但我認爲重要的是要作出區分 - 它們不是unsigned int類型。

一旦你得到了肯定的文字,就應用一元運算符。這就是爲什麼INT_MIN通常被定義爲:

#define INT_MIN  (-2147483647 - 1) 

因爲你不能用這個平臺上signed int表示2147483648。

+4

不,不是所有文字都被簽名,你可能意思是「沒有'U'後綴的所有小數文字都被簽名」。即使沒有「U」後綴,八進制和十六進制文字也可以無符號。 –

+0

正確的是你。 +1。 –

2

是的,你的解釋是正確的,所有的數字文字不包括符號,最終標誌是一元運算符適用於它。

文字的類型是這樣選擇的,即文字的值在該類型中是可表示的,所以有效的有效數字文字總是表示正值。

1

所有(文字)數字常量都是無符號的。

這是錯誤的,實際上只有非前綴的十進制整數文字被簽名。其他整數文字是無符號或有符號的。

這是否意味着編譯器將有符號數值常量(如-5.1E10或-1)解釋爲相應一元運算符的調用? e.g -1 < => - (1),512 < => +(512)

如果應用-爲無符號文字,其結果爲(通常)仍然無符號的。 例如:

-1U   // unsigned quantity 
-0xFFFFFFFF // unsigned quantity (assuming 32-bit int) 

簽名的結果至C整數轉換規則轉換成無符號的。