問題: d=1,-d==?
我們看看答案會是什麼樣的:
-----------------------------
下面的代碼的 輸出是什嗎?
int main() {
char dt = '\1';
long tdt;
tdt = -dt;
printf("%ld\n", tdt);
}
我的第一反應是這個輸出應該是”-1“。 我想你也是這樣認為的。然而如果在64位系統上輸出是什麼 呢?我期望也是”-1“。 我們看看是這樣的嗎。
讓我們測試一下。
#xlc -q64 a.c - qlanglvl=extended
#./a.out
4294967295
!! 這裡的輸出是“4294967295” 而不是“-1”,怎麼會這 樣呢?
別急別急,可能是我們漏了什嗎?
在回答之前上面問題之前,我們看看下面程式碼片段:
"char dt = '\1'; -dt;"
對於這個程式碼片段,我們確認一下dt變數是有符號還是沒有符號的?C
我們看看C語言標準怎麼說的:
The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char.
也就是說標準沒有對char類型變數的符號做要求。我們在看看XL 編譯器的文檔 http://publib.boulder.ibm.com/infocenter/comphelp/v111v131/topic/com.ibm.xlc111.aix.doc/language _ref/ch.html
裡面說:
By default, char behaves like an unsigned char. To change this default, you can use the -qchars option or the #pragma chars directive. See -qchars for more information.
看來XL編譯器中,char預設是無符號的。我們可以用-qchars來改變這個預設行為。我們來測 試一下:
#xlc -q64 a.c -qlanglvl=extended -qchar=signed
#./a.out
-1
太好了,原來如 此。我們好像明白了。