int值通常何时转换为无符号? 这里来自C++ Prime第五:
如果在算术表达式中同时使用无符号和int值,int值通常会转换为无符号 我尝试了以下代码:int值通常何时转换为无符号? 这里来自C++ Prime第五:,c++,int,unsigned,C++,Int,Unsigned,如果在算术表达式中同时使用无符号和int值,int值通常会转换为无符号 我尝试了以下代码: int i = -40; unsigned u = 42; unsigned i2 = i; std::cout << i2 << std::endl; // 4294967256 std::cout << i + u << std::endl; // 2 inti=-40; 无符号u=42; 无符号i2=i; std::cout是 您遇到的是整数溢出。
int i = -40;
unsigned u = 42;
unsigned i2 = i;
std::cout << i2 << std::endl; // 4294967256
std::cout << i + u << std::endl; // 2
inti=-40;
无符号u=42;
无符号i2=i;
std::cout是
您遇到的是整数溢出。负数的符号由前导符号位给出,它是0(正)或1(负)。但是,对于无符号整数,此前导位只提供多一位整数精度,而不是符号指示。“负”有符号数最终从最大无符号整数大小向后计数
这与您的特定代码有什么关系?嗯,-40确实变成了4294967256。然而,4294967256+42不能放入无符号整数,就好像你还记得-40刚刚变成了最大无符号整数减去39。因此,通过添加42,您超过了数据类型的容量。可能的第33位被切掉,然后从0开始。因此,仍然得到2作为答案
Signed: -42, -41, ..., -1, 0, 1, 2
Unsigned: 4294967256, 4294967257, ..., 4294967295, 0, 1, 2, ...
^--^ Overflow!
你可能会有兴趣阅读关于为什么i+u
不能等于2?根据规则,i+u
,i
转换为4294967256
。你的问题可能有点离题。一个更具启发性的问题可能是“为什么——如果这条规则真的被应用了——我仍然能得到答案2
?”