【发布时间】:2013-07-23 20:36:04
【问题描述】:
我了解,关于隐式转换,如果我们有一个无符号类型操作数和一个有符号类型操作数,并且无符号操作数的类型与有符号操作数的类型相同(或大于),则有符号操作数将被转换为无符号。
所以:
unsigned int u = 10;
signed int s = -8;
std::cout << s + u << std::endl;
//prints 2 because it will convert `s` to `unsigned int`, now `s` has the value
//4294967288, then it will add `u` to it, which is an out-of-range value, so,
//in my machine, `4294967298 % 4294967296 = 2`
我不明白 - 我读到如果有符号操作数的类型大于无符号操作数:
如果无符号类型中的所有值都适合较大的类型,则无符号操作数将转换为有符号类型
如果无符号类型中的值不适合更大的类型,则有符号操作数将转换为无符号类型
所以在下面的代码中:
signed long long s = -8;
unsigned int u = 10;
std::cout << s + u << std::endl;
u 将被转换为signed long long,因为int 值可以适合signed long long??
如果是这样,在什么情况下较小的类型值不适合较大的类型值?
【问题讨论】:
-
你的第一个例子不是很好,因为结果应该是2。如果您想在计算后查看该值是否有符号,请使用结果为负的值。
标签: c++ type-conversion unsigned-integer arithmetic-expressions