2017-09-20 198 views
-5
#include <iostream> 

int main() { 


    char x = 'a'; 
    char y = 'b'; 
    char z = x + y; 
     printf("%d\n",z); 
    return 0; 
} 

爲什麼這段代碼的輸出是-61?C++隱式轉換

+2

爲什麼你打印一個數字/數字的字符? – doctorlove

+1

爲什麼在包含''之後使用'printf'? – MSalters

+0

和'printf'不屬於'iostream' – Chiel

回答

3

您使用%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; 
+4

那麼,這仍然不會打印出可識別的東西,當然不是'ab'。這當然是合法的,但這個問題很奇怪。目前還不清楚_expected_輸出是什麼。 – MSalters

+0

是的,我完全同意,但我回答**隱式轉換**。 –

+0

更新了我的答案以獲取更多詳細信息 –

0

一) 每個字符是在電腦一個號碼。 (一臺電腦只能處理數字,字符是電腦的「唯一」圖像。)

所以:搜索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上可能會有其他結果。

+0

不,溢出是UB非模塊化算術 –

+0

是的,它對C++規範沒有定義。但這是CPU的功能。這就是「爲什麼-61」的問題。 –

+0

不,CPU的功能與是否定義無關。它的UB是有原因的。你的回答意味着這是定義的行爲,至少可以說是誤導性的。 –