2011-09-27 55 views
2

爲什麼下面的代碼打印「?」 ? 又如何將-1分配給unsigned char爲char指定負值

char test; 
unsigned char testu; //isn't it supposed to hold values in range 0 - 255? 
test = -1; 
testu = -1; 
cout<<"TEST CHAR = "<<test<<endl; 
cout<<"TESTU CHAR = "<<testu<<endl; 

回答

11

unsigned僅影響數字的內部表示(char s是數字,記得)如何解釋。所以-11111 1111two's complement符號,當其放入unsigned char改變含義(對於相同的比特表示)到255

問號可能是您的字體/代碼頁的未映射(擴展)ASCII結果值255可以顯示一個字符。

我不認爲<<辨別無符號字符和有符號字符之間,因爲它將它們的值解釋爲ASCII碼,而不是純數字。

另外,它depends on your compiler是否默認爲char s是有符號或無符號的;實際上,規範指出有three different char types(普通,有符號和無符號)。

+0

真棒的答案。謝謝! – Nemo

+0

'char'在執行時可以像'signed char'或'unsigned char'那樣表現,但是與它的行爲類似,它是一種獨立的類型。是的,這聽起來像是一個向後兼容的保持人人開心的黑客(實際上可能會導致很多人遇到問題)。 –

3

我不知道C或C++,但我的直覺告訴我,它的包裝-1〜255,打印ÿ,但由於在第一128個字符不是它打印?代替。只是一個猜測。

要測試此項,請嘗試分配-191並查看它是否打印A(或B,如果我的數學運算關閉)。

+1

它打印的內容取決於語言環境。 'ÿ'是Unicode或Latin-1中的字符255,但是例如UTF-8中它具有多字節表示形式。 –

4

當你給一個無符號變量賦一個負值時,結果就是它迴繞了。在這種情況下-1變成255。

+0

正確。將整數轉換爲無符號類型時,模數1大於無符號類型的最大值。對於具有8位字節的典型系統,其模數爲256(UCHAR_MAX + 1)。 –

0

有符號/無符號是通過使用該數字的最高位來定義的。 您可以爲其分配一個負整數。符號位將在簽名的情況下進行解釋(當您使用它進行算術運算時)。當你把它像一個角色會簡單地採取最高位,如果它是一個unsigned char和剛剛產生的ASCII字符超過127(十進制):

unsigned char c = -2; 

等同於:

unsigned char c = 128; 

當c被視爲一個字符。 -1是一個例外:它具有全部8位設置並被視爲255 dec。