[英]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.