涉及c ++中有符号和无符号类型的表达式

时间:2014-08-31 08:39:17

标签: c++ expression

我正在学习C ++语言,本书的一个建议是不要混合表达式有符号和无符号类型,因为签名类型将转换为无符号。

例如:

unsigned int u = 10; 
int a = 42; 
std::cout << u - a << std::endl; // here the value will wraps around 

在这个程序之后,如果我尝试使用typeid的类型,结果是int,为什么? 为什么a的类型不是更符号,但它返回int?

2 个答案:

答案 0 :(得分:3)

变量未转换为无符号。它的值被转换为unsigned以在表达式中使用。也就是说,当你这样做时:

std::cout << u - a << std::endl;

a创建一个临时的无名无符号整数,然后从u中减去。就好像你这样做了:

std::cout << u - (unsigned int)a << std::endl;

或者这个:

unsigned int __nameless__ = a;
std::cout << u - __nameless__ << std::endl;

除了__nameless__变量实际上不存在于该表达式之外。

答案 1 :(得分:0)

变量的类型不会改变;当评估表达式时,子表达式可以被转换或强制转换为不同的类型。所以在示例u - a中,右边的子表达式被转换为匹配左边的子表达式的类型,但是,从概念上讲,这是一个不可见的中间结果,属于另一种类型,而不是原始的底层变量改变了。