簡體   English   中英

超出有符號字符數據類型的范圍

[英]exceeding range for signed char data type

如果我們在一個支持 unsigned char 數據類型的平台上,那么 char 的范圍是從 0 到 255。所以,

char c = 255 ;
c++ ;
cout << c ; // 0 gets stored to c, which corresponds to null character.

但是如果我們在一個支持有符號字符(-128 到 127)的平台上怎么辦?

char d = 127 ;
d++ ;
cout << d ; // will it get the value of -128 or 0 ?

如果是-128,那我們怎么知道它對應的ASCII符號呢? (因為大多數網站都顯示 ASCII 0 到 255 的符號)謝謝:)

自 C++20 以來,有符號整數類型始終是 -2^b.. 2^b - 1 的環,其中 b 是位數。 所以,在你的第二個例子中,如果 char 是 8 位的,你可能會有-128 [1]。 我說“可能”,因為技術上簽名的 integer 溢出仍然是 UB,任何事情都可能發生,所以這是不依賴它的另一個原因(更多原因見下文)。

如果您想要范圍且 char 是 8 位 0.. 255 [1],則需要使用unsigned char 這不是依賴於平台的功能。

嚴格來說,沒有 ASCII 碼 > 127 這樣的東西,但是,大多數平台確實將字符圖像定義為 0..255。 在這種情況下,打印的字符就像您將char重新解釋為unsigned char一樣。 所以-1 -> 255-2 -> 254等等,只要char是 8 位。

嚴格來說,字符范圍不一定是8位; 有不同字符大小的平台,例如 9 位過去很常見,所以你根本不依賴它。

無符號 integer (因此, unsigned char是 integer 類型)溢出是明確定義的; 你的c == 0

但對於 ( signed ) char §5 [expr]/p4:

如果在計算表達式期間,結果未在數學上定義或不在其類型的可表示值范圍內,則行為未定義。

所以, d可能是任何東西。 -128、0、13、255。

如果是-128,那我們怎么知道它對應的ASCII符號呢?

ASCII 只是代碼點的一種解釋。 沒有對負值的解釋。 所以,這個問題毫無意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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