Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
int值通常何时转换为无符号? 这里来自C++ Prime第五:_C++_Int_Unsigned - Fatal编程技术网

int值通常何时转换为无符号? 这里来自C++ Prime第五:

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值,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是

您遇到的是整数溢出。负数的符号由前导符号位给出,它是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
?”