簡體   English   中英

"為什么當我執行 cout c 時代碼輸出為 -61 而當我 cout a+b 時輸出為 195?"

[英]Why is the code giving output of -61 when I do cout c but 195 when I cout a+b?

我寫了以下代碼,我不明白為什么當我 cout<<int(c) 時我得到 -61。

int main() {
char a= 'a';
char b= 'b';
char c= a+b;
cout<<int(a)<<" ";
cout<<int(b)<<" ";
cout<<int(a+b)<<" ";
cout<<int(c)<<" ";
return 0;

char 類型可以是有符號或無符號的。 它由編譯器標志調整。 Char 類型在大多數編譯器中默認是有符號的,由 8 位組成,1 位用於符號,7 位用於數值。 因此,有符號字符表示從 -128 到 127 的數值。這樣的一組值是一個環。 進一步增加 127 返回 -128。

如您所見,97 和 98 是 'a' 和 'b' 的 ASCII 碼。 在應用運算符之前,任何小於 int 的類型都會被提升為 int,因此 a+b 是 int 195。如果將 195 分配給有符號字符,則會發生有符號值溢出,這被認為是未定義的行為,因為可以表示有符號值與上面不同。 在您的情況下,195 在 68 上超過 127,因為 127+1 是 -128,因此 127+68 127+1+67 是 -128+67 是 -61。

C++ 沒有operator+(char,char)<\/code> 。 因此,當您添加兩個char<\/code>時,參數將提升為int<\/code> ,結果為int<\/code> 。

使用超出編譯器char<\/code>范圍(似乎是-128<\/code> ... 127<\/code> )的int<\/code> (值195<\/code> )進一步初始化char<\/code> c 是 C++ 標准的實現定義行為。

在您的實現中,行為看起來很常見......對於值x > 127<\/code>非常有效,結果是x - 256<\/code> 。 195 - 256<\/code>是值-61<\/code> 。

如果您想要195<\/code>范圍內的 8 位整數,您應該使用unsigned char<\/code>或uint8_t<\/code> 。

暫無
暫無

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

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