2011-09-24 162 views
10

有代碼:增加兩個無符號字符變量,結果爲int

#include <iostream> 
int main(){ 
    unsigned char a = 4, b = 255; 
    int g = (unsigned char)a + (unsigned char)b; 
    std::cout << g << std::endl; 
    return 0; 
} 

結果:

259 

爲什麼結果是259,而不是3?如果添加了兩個無符號字符變量,應該有溢出,結果應該是3,然後將其應無符號的字符轉換3到int 3

回答

14

加法運算將第一promote其操作數int,在做加法之前。這就是C的工作原理。如果要截斷,則需要將其重新分配爲較窄的類型,例如unsigned char

6

從不對小於int的數據類型執行整數運算。例如,對於小於int例如如果添加了兩種類型charshort int,則在進行任何算術運算之前將它們提升爲int,並且結果爲整數類型。如果其中一個類型碰巧比int大,例如long long intint,那麼int將被提升爲long long int,結果爲long long int

(第4.5/1) - 型炭的右邊的值,符號的字符,無符號的字符,短 int或無符號短 INT可以轉換爲int類型的右值如果INT可以表示 所有源類型的值;否則,源rvalue可以被 轉換爲類型爲unsigned int的右值。