[英]What does the unsigned keyword do here?
我寫了一些C ++代碼以在我正在讀的書中找到的控制台上顯示ASCII字符。 代碼如下:
#include <iostream>
using namespace std;
int main()
{
for (unsigned char i = 32; i<128; i++)
cout << i;
int response;
cin >> response;
return 0;
}
當我取消unsigned
關鍵字並改用signed
,結果將變得無限,並且PC會發出嗶聲,直到我關閉了可執行文件。 但是,當我使用int i
變量時,不需要取消對該變量的簽名。 這是為什么?
unsigned
只是意味着數字不會變為負數。 是的,數字,因為char
實際上只是一個8位整數。
因此,當使用unsigned
,每個位都在非負范圍內使用,范圍從0到255。當您省略並使用帶signed
(默認)的char時,范圍將從-128到127,因此它將始終小於128並進入無限循環。
您聽到的提示音是由於值7的字符被“打印”了。
另一方面,即使有符號, int
也會從-2.147 ... billions一直增加到+ 21.47b億美元,因此它將正常迭代直到達到128並停止。
帶符號的char
類型的范圍是-128
到+127
。
因此, i<128
永遠不會為假,因此您的循環將永遠不會終止。
取而代之的是,將127 + 1
作為帶符號的char會回繞到-128
(因為它將設置符號位),然后它將第二次繼續循環。
這第二次迭代將包括每個字符,包括\\a
(鈴鐺),在打印時會發出蜂鳴聲。
無符號表示變量將僅包含正值,這意味着它們可以包含較大的正數。 無符號字符的范圍通常是0到255,帶符號字符的范圍是-128到+127。 這在不同的硬件上可能會有所不同(但可能不會在大多數硬件上使用)。
當變量從最大值增加時,它將溢出。 變量發生什么情況取決於它是否未簽名。 保證無符號類型變為0,而有符號類型的行為是不確定的。 在我看到的大多數系統上,變量都回繞到最小值(在這種情況下為-128),但是您不能依賴此行為。
這意味着變量永遠不會達到128,因此循環將永遠繼續。
如果轉到此頁面並查看基本數據類型,則可以看到所有基本類型的有符號和無符號的典型范圍: http : //www.cplusplus.com/doc/tutorial/variables/
signed char
范圍是-128至+127,因此它將始終小於128
當你做
signed i=127;
i++;
i
通常是-128(但是您不能以這種方式指望)
unsigned char
范圍是0到255
並非所有ASCII字符都可打印! 打印它們是胡說八道。
有signed char
和unsigned char
是不同的整數類型。 顧名思義,一個是有符號類型(即可以表示負值),另一個是無符號類型(即。只能表示非負值)。
沒有signed
或未unsigned
前綴的char
類型是另一種不同的類型。 它具有相同的表示和范圍作為任一 signed char
或 unsigned char
; 哪一個是實現定義的。 (一個微妙的點:即使它們中的兩個具有相同的特征,它們仍然是三種不同的類型。)
對於典型的實現,所有這三種類型都是8位,有符號類型用二進制補碼表示,使有signed char
的范圍為-128 .. +127, unsigned char
的范圍為0 .. +255。
在您的實現中,純char
似乎已簽名(這很常見)。 因此,如果i
的類型為char
,則i < 128
始終為 true,並且您有無限循環。 將char
或有signed char
對象增加到最大值以上實際上具有未定義的行為,但是通常它會從最大值環繞到最小值,這就是您所看到的。 (當打印的字符是\\007
(ASCII BEL
字符)時,可能會發出蜂鳴聲;要么,要么是您發送的控制字符弄亂了您的終端。)
將i
為unsigned char
的范圍為0到255,並且循環達到128時將停止循環。(將無符號類型的值遞增到其最大值以上是明確定義的,但無論如何您都不要這樣做。)
int
始終是帶符號的類型,語言要求其范圍至少為-32767 .. +32767。 如今,通常為32位,范圍為-2147483648 .. +2147483647。 但是,即使具有所需的最小范圍,它也足以容納您的循環。
帶符號的字符(至少在典型情況下)只能表示-128至+127的值。 由於永遠不會有值128,因此循環將永遠運行。
正式地,當其值為127並且您增加時,結果是未定義的行為。 實際上,在幾乎所有典型機器上(使用2的補碼的任何機器),當其值為127並遞增時,它將回繞至-128,遞增回至127,回繞至-128並經歷整個周期再次。
使用無符號字符,您將獲得從0到(至少)255的值,因此當您達到127並遞增時,該值將達到128,從而按預期結束循環。
同樣,一個int
必須具有至少-32767到+32767的范圍。 因此,當其值為127並增加時,結果將為128,這與您通常期望的一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.