char是單位元組字元型別,因此佔8個二進位制位。計算機中字元一般用整數表示,不同的整數表示不同的字元,具體的表示方案稱為(內碼)編碼方案。ANSI/ASCII是美國國家標準的7位編碼,取值為0~127,對應於char的低7位。對於cone、ctwo、cthree而言,初始化時隱式地把1、2、0這些無後綴的整數字面量(型別為int)經過型別轉換儲存至這些char變數中。char到int(32位平臺上為4位元組)的型別轉換沒有損失精度,因此只是在高位補0,cone、ctwo、cthree儲存的還是整數1、2、0。cthree=cone+ctwo被計算之後,cthree儲存的整數等於3。但對於cout而言,<<之後的運算元cthree本身是一個char型別的表示式,於是編譯器選擇了接受char型別的引數過載版本的<<運算子,這個運算子的內部實現中把引數作為ASCII字元處理,輸出對應的字元。ASCII編碼為3的字元不是可列印字元,而是控制字元,輸出的內容不確定,具體圖案由平臺決定。如果要輸出數字,那麼結果轉換為int等能被cout作為數來處理的型別就行了,例如:cout << (int)cthree << endl; //C風格轉換;cout << int(cthree) << endl; //利用基本型別建構函式的C++風格轉換;cout << static_cast<int>(cthree) << endl; //C++風格的靜態轉換;cout << reinterpret_cast<int>(cthree) << endl; //C++風格的直接轉換;當然,更好的做法是,不要用char儲存用來作整數運算的數,以免語義的模糊。順便, 豬頭或火寶寶 錯誤,"1"的ASCII為49,"2"的ASCII為50,加法的結果為99,對應的ASCII字元是"c",不會輸出字元"3"。事實上,"0"到"9"這幾個字元的ASCII是連續的,對應於整數0x30(十進位制48)到0x39,"3"是0x33即十進位制的51,因此 Player1005 的 cthree + 0x30(這裡也就是3 + 48)和sky_baofish 的 "1"+2 都能得到預期結果"3"。----↑2010-7-25 14:34----char型別是字元型別,同時可以參與算術運算(表示一個單位元組能存放的下的整數)。C中原本存在兩種單位元組整數——unsigned char,範圍是[0, 256);signed char,範圍是[-128, 128)。除了算術運算外,這兩種型別之一被利用儲存ASCII字元(因為只用低7位,所以儲存字元的效果都一樣):有些平臺使用unsigned char,有些平臺使用signed char。為了統一起見,ANSI C89引入了char型別專門表示字元型別(在C++中也保留了這個特性)。但為了和標準制定之前的原始碼相容,規定char型別參加算術運算的行為和unsigned char和signed char其中一個相同,而具體是哪一個,由平臺決定。並且,char、unsigned char和signed char是三種不同的型別(儘管由於上面的規定某兩種型別的算術運算特性完全相同)。為了明確整數的範圍,一般char專用於儲存字元,而單位元組整數用signed char和unsigned char來表示。不過對於整數區間[0,128)之內的運算,用char還是安全的。char變數不一定能夠完整地儲存int型別的值。但是,一個整數足夠小,就可能一個被char變數安全地表示——此時這個整數值複製給char的時候不會有問題。當超出char的儲存範圍時,一般的實現中會發生截斷,char中會保留最低或最高8位的值(這個又是平臺相關的,有興趣的話可以搜尋“位元組序”)。顯然這不是算術運算中期望的結果,所以如果字面量複製給char或其它整數時超過被賦值/初始化物件的表示範圍,編譯器至少會產生一個警告。不過執行期範圍檢查編譯器是做不到的,所以退一步,編譯時檢查型別,對於可能會損失精度的型別(例如int變數到char變數)物件之間的賦值/初始化,編譯器產生警告或錯誤。====[原創回答團]
char是單位元組字元型別,因此佔8個二進位制位。計算機中字元一般用整數表示,不同的整數表示不同的字元,具體的表示方案稱為(內碼)編碼方案。ANSI/ASCII是美國國家標準的7位編碼,取值為0~127,對應於char的低7位。對於cone、ctwo、cthree而言,初始化時隱式地把1、2、0這些無後綴的整數字面量(型別為int)經過型別轉換儲存至這些char變數中。char到int(32位平臺上為4位元組)的型別轉換沒有損失精度,因此只是在高位補0,cone、ctwo、cthree儲存的還是整數1、2、0。cthree=cone+ctwo被計算之後,cthree儲存的整數等於3。但對於cout而言,<<之後的運算元cthree本身是一個char型別的表示式,於是編譯器選擇了接受char型別的引數過載版本的<<運算子,這個運算子的內部實現中把引數作為ASCII字元處理,輸出對應的字元。ASCII編碼為3的字元不是可列印字元,而是控制字元,輸出的內容不確定,具體圖案由平臺決定。如果要輸出數字,那麼結果轉換為int等能被cout作為數來處理的型別就行了,例如:cout << (int)cthree << endl; //C風格轉換;cout << int(cthree) << endl; //利用基本型別建構函式的C++風格轉換;cout << static_cast<int>(cthree) << endl; //C++風格的靜態轉換;cout << reinterpret_cast<int>(cthree) << endl; //C++風格的直接轉換;當然,更好的做法是,不要用char儲存用來作整數運算的數,以免語義的模糊。順便, 豬頭或火寶寶 錯誤,"1"的ASCII為49,"2"的ASCII為50,加法的結果為99,對應的ASCII字元是"c",不會輸出字元"3"。事實上,"0"到"9"這幾個字元的ASCII是連續的,對應於整數0x30(十進位制48)到0x39,"3"是0x33即十進位制的51,因此 Player1005 的 cthree + 0x30(這裡也就是3 + 48)和sky_baofish 的 "1"+2 都能得到預期結果"3"。----↑2010-7-25 14:34----char型別是字元型別,同時可以參與算術運算(表示一個單位元組能存放的下的整數)。C中原本存在兩種單位元組整數——unsigned char,範圍是[0, 256);signed char,範圍是[-128, 128)。除了算術運算外,這兩種型別之一被利用儲存ASCII字元(因為只用低7位,所以儲存字元的效果都一樣):有些平臺使用unsigned char,有些平臺使用signed char。為了統一起見,ANSI C89引入了char型別專門表示字元型別(在C++中也保留了這個特性)。但為了和標準制定之前的原始碼相容,規定char型別參加算術運算的行為和unsigned char和signed char其中一個相同,而具體是哪一個,由平臺決定。並且,char、unsigned char和signed char是三種不同的型別(儘管由於上面的規定某兩種型別的算術運算特性完全相同)。為了明確整數的範圍,一般char專用於儲存字元,而單位元組整數用signed char和unsigned char來表示。不過對於整數區間[0,128)之內的運算,用char還是安全的。char變數不一定能夠完整地儲存int型別的值。但是,一個整數足夠小,就可能一個被char變數安全地表示——此時這個整數值複製給char的時候不會有問題。當超出char的儲存範圍時,一般的實現中會發生截斷,char中會保留最低或最高8位的值(這個又是平臺相關的,有興趣的話可以搜尋“位元組序”)。顯然這不是算術運算中期望的結果,所以如果字面量複製給char或其它整數時超過被賦值/初始化物件的表示範圍,編譯器至少會產生一個警告。不過執行期範圍檢查編譯器是做不到的,所以退一步,編譯時檢查型別,對於可能會損失精度的型別(例如int變數到char變數)物件之間的賦值/初始化,編譯器產生警告或錯誤。====[原創回答團]