#include <iostream>
int main() {
char x = 'a';
char y = 'b';
char z = x + y;
printf("%d\n",z);
return 0;
}
爲什麼這段代碼的輸出是-61?C++隱式轉換
#include <iostream>
int main() {
char x = 'a';
char y = 'b';
char z = x + y;
printf("%d\n",z);
return 0;
}
爲什麼這段代碼的輸出是-61?C++隱式轉換
您使用%d應該%C
char x = 'a';
char y = 'b';
char z = x + y;
printf("%c\n",z);
return 0;
,如果你管理打印ab
你應該使用字符串像這樣:
string x = "a";
string y = "b";
string z = x + y;
cout <<z<<endl;
return 0;
那麼,這仍然不會打印出可識別的東西,當然不是'ab'。這當然是合法的,但這個問題很奇怪。目前還不清楚_expected_輸出是什麼。 – MSalters
是的,我完全同意,但我回答**隱式轉換**。 –
更新了我的答案以獲取更多詳細信息 –
一) 每個字符是在電腦一個號碼。 (一臺電腦只能處理數字,字符是電腦的「唯一」圖像。)
所以:搜索ASCII表。例如http://www.asciitable.com/
- > A = 97,B = 98
A + B = 97 + 98 = 195
B) 炭被定義爲8位(= 256個數字)與符號:它可以包含-128到127之間的數字。所以195不適合。當計算這個時,運載器被扔掉,並且出現這樣一個數字。
編輯:
要顯示,什麼內部發生:計算二進制:
0110 0001 ('a' = 97)
+0110 0010 ('b' = 98)
---------
1100 0011
因爲這是一個有符號數,這是存儲two complement。 第一項是設置 - >否定。但最簡單的方法(對我來說)來計算:
該第一位的值爲-128,第二位爲64. 最小位:2和1.因此:-128 + 64 + 2 + 1 = -61
希望這有助於比這更是混亂...
編輯2:
隨着討論的結果是:這是你的CPU上會發生什麼。這是因爲CPU有一些技術參數。但是你不能假設,這發生在每個CPU上! C++爲每個CPU編譯/但在C/C++中沒有定義溢出,所以在其他CPU上可能會有其他結果。
不,溢出是UB非模塊化算術 –
是的,它對C++規範沒有定義。但這是CPU的功能。這就是「爲什麼-61」的問題。 –
不,CPU的功能與是否定義無關。它的UB是有原因的。你的回答意味着這是定義的行爲,至少可以說是誤導性的。 –
爲什麼你打印一個數字/數字的字符? – doctorlove
爲什麼在包含''之後使用'printf'? –
MSalters
和'printf'不屬於'iostream' – Chiel