整数转换问题
Issue with Integer Conversion
int left = std::numeric_limits<int>::min();
int right = -1;
//the code below instead of give one more than int_max gives: 18446744071562067968
unsigned long long result = left * right;
我试图查找 UAC,但即使根据 UAC 规则,这也应该产生正确的输出。知道为什么结果不正确吗?
将
有符号 2 的补码int
的最小值乘以 -1 是未定义的行为,因为结果超出了类型的范围。
在这种情况下,您的输出与结果一致 -2147483648,即溢出似乎已经环绕。不能对有符号类型依赖环绕,而只能依赖无符号类型。
将计算结果分配给unsigned long long
不会更改执行计算的类型。一旦你做了乘法,你就输了。因此,在相乘之前将其中一个操作数转换为 unsigned long long
。
两个操作数都是int
的,所以算术是在int
类型内执行的;运算的结果会溢出int
的范围,所以结果是未定义的。
若要获得预期的结果,请先将一个操作数转换为long long
:
unsigned long long result = left * (long long) right;
这仍然是潜在的未定义行为;尽早转换为无符号算术更安全(因为无符号算术会换行并且不会溢出):
unsigned long long result = left * (unsigned long long) right;
请注意,您得到的结果是 0xffffffff80000000
;这表明操作的实际结果std::numeric_limits<int>::min()
在 int
类型中,然后符号扩展并强制转换为 unsigned long long
。
Tha 原因是乘法是根据 int
提交的
这两个参数都是int
的,所以乘法给出了一个int
agein,你是对的,它给出了int_max
+ 1,这与int_min
=-2147483648相等。所以它实际上是 -2147483648,但对于无符号的长长,它等同于18446744071562067968,请参阅十六进制代码:
int_min = 80000000
(unsigned long long) (int min) = ffffffff80000000
相关文章:
- C++转换参数初始化问题
- 将父类对象强制转换为子类的问题
- 模板类转换问题 - 无法推断调用的函数
- 将旧管道转换为现代 openGL 时出现问题
- 将字节数组转换为带有字节序问题的指针
- 复制构造函数隐式转换问题
- 使用转换器提升 Python 问题 - 静态链接
- 与模板 (c++) 相关的转换问题
- 将文件复制到自定义位置,存在字符串转换问题
- 从基指针到派生的强制转换问题
- JNI 日期值转换问题,在C++中获取不同的长整型值
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 将字符数组转换为结构时出现问题. 结构的字符数组变量溢出
- PX 转换例程编译问题
- 类型转换问题
- C++,遇到将双精度转换为整数的问题
- 拆分 pybind11 模块和自动类型转换问题
- 类型转换问题:返回为整数而不是浮点/类型
- Unicode 字符问题/转换参数
- c++和OpenCV:问题转换图像到灰度