簡體   English   中英

unsigned關鍵字在這里做什么?

[英]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 charunsigned 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字符)時,可能會發出蜂鳴聲;要么,要么是您發送的控制字符弄亂了您的終端。)

iunsigned 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM