爲什麼下面的代碼打印「?」 ? 又如何將-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;
爲什麼下面的代碼打印「?」 ? 又如何將-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;
unsigned
僅影響數字的內部表示(char
s是數字,記得)如何解釋。所以-1
是1111 1111
在two's complement符號,當其放入unsigned char
改變含義(對於相同的比特表示)到255
問號可能是您的字體/代碼頁的未映射(擴展)ASCII結果值255可以顯示一個字符。
我不認爲<<
辨別無符號字符和有符號字符之間,因爲它將它們的值解釋爲ASCII碼,而不是純數字。
另外,它depends on your compiler是否默認爲char
s是有符號或無符號的;實際上,規範指出有three different char types(普通,有符號和無符號)。
我不知道C或C++,但我的直覺告訴我,它的包裝-1〜255,打印ÿ
,但由於在第一128個字符不是它打印?
代替。只是一個猜測。
要測試此項,請嘗試分配-191
並查看它是否打印A
(或B
,如果我的數學運算關閉)。
它打印的內容取決於語言環境。 'ÿ'是Unicode或Latin-1中的字符255,但是例如UTF-8中它具有多字節表示形式。 –
當你給一個無符號變量賦一個負值時,結果就是它迴繞了。在這種情況下-1變成255。
正確。將整數轉換爲無符號類型時,模數1大於無符號類型的最大值。對於具有8位字節的典型系統,其模數爲256(UCHAR_MAX + 1)。 –
有符號/無符號是通過使用該數字的最高位來定義的。 您可以爲其分配一個負整數。符號位將在簽名的情況下進行解釋(當您使用它進行算術運算時)。當你把它像一個角色會簡單地採取最高位,如果它是一個unsigned char和剛剛產生的ASCII字符超過127(十進制):
unsigned char c = -2;
等同於:
unsigned char c = 128;
當c被視爲一個字符。 -1是一個例外:它具有全部8位設置並被視爲255 dec。
真棒的答案。謝謝! – Nemo
'char'在執行時可以像'signed char'或'unsigned char'那樣表現,但是與它的行爲類似,它是一種獨立的類型。是的,這聽起來像是一個向後兼容的保持人人開心的黑客(實際上可能會導致很多人遇到問題)。 –