2012-06-14 184 views
1

我想弄清楚發生了什麼這個代碼混合datat型混淆了C++

int i = 10, j = 7, l; 
unsigned int k; 
double q = 3.56; 
char c; 

c = q * i * j; 
l = c; 
std::cout << l << "\n"; // result is -7 
std::cout << c << "\n"; // result is ? 

我不明白爲什麼我的結果是「7」,且C不管我改變i的值,j c的結果總是'?'。任何人都可以指出我的理由嗎?謝謝

+0

http://www.asciitable.com/它的一個char數據類型。 – corn3lius

回答

1

字符的默認顯示方法是它的ascii/unicode值。對於它無法顯示的值,被顯示。 對於其他人,將顯示等效字符。例如,一個65的字符值會顯示A

+0

至於-7,請參閱馬克的答案:) –

6

3.56 * 10 * 7的結果是249.2。

如果系統上的類型char是帶符號的8位值,範圍從-128到127,則嘗試分配249.2會導致溢出。如果分配給int而不是char,則它將存儲爲249.

問號是因爲-7不是可打印的字符。

+0

很好的解釋,除了值得加上爲什麼「導致溢出」導致-7尤其值得一提。我不確定如何輕鬆地解釋它,而無需鏈接到2的補碼上,但「249 - 256 = 7」似乎是一個開始。 (當然C++並不能保證簽名值以這種方式工作,只是發生在提問者的平臺上,就像大多數人一樣,這樣做。) – abarnert

0

您正在將值249.2寫入超出範圍的已簽名字符,因此將其轉換爲?字符。

0

3.56 * 7 * 10是249.200 ..... 2。當它被放入char時,它變成-7,因爲char是一個8位有符號值。 -7來自249(截斷) - 256.