c++ - 为什么 -INT_MIN 对于 uint64_t 类型不是 2147483648
问题描述
我理解的结果p
。有人可以解释为什么up2 (uint64_t type) != 2147483648
但是up (uint32_t type) == 2147483648
?
有人提到将 -INT_MIN 分配给无符号整数 up2 会导致溢出,但是
-INT_MIN
已经是一个正数,所以可以将它分配给uint64_t up2
?-INT_MIN
为什么分配给似乎没问题uint32_t up
?它产生正确的结果为 2147483648。#include <iostream> #include <climits> using namespace std; int main() { int n = INT_MIN; int p = -n; uint32_t up = -n; uint64_t up2 = -n; cout << "n: " << n << endl; cout << "p: " << p << " up: " << up << " up2: " << up2 << endl; return 0; }
结果:
n: -2147483648 p: -2147483648 //because -INT_MIN = INT_MIN for signed integer up: 2147483648 //because up is unsigned int from 0 to 4,294,967,295 (2^32 − 1) and can cover 2147483648 up2: 18446744071562067968 //Question here. WHY up2 != up (2147483648)???
解决方案
的行为在 2 的补码系统上int p = -n;
是未定义的(接受你的问题中有错字;INT_MAX
在这样的系统上总是很奇怪),因为你溢出了一个int
类型。所以你的整个程序是未定义的。
这就是为什么您在许多库中看到的INT_MIN
定义。-INT_MAX - 1
推荐阅读
- reactjs - 尝试使用 Jest 在 textinput 组件上测试模拟更改
- android - Android Room - 类型转换器在实体字段范围内不起作用
- java - Solr Nextcursor 标记返回错误 Unable to parse 'cursorMark' after totem
- gantt-chart - 如何在 youtrack 甘特图中更改休息日
- javascript - 什么是 javascript "[ <3 empty items> ]" 结构?
- rdf - 如何通过访问网络信息自动更新本体属性?
- laravel - 如何使用 LARAVEL 中的 where 条件在 SQL 中检索 Json 数据类型数据
- python - 在视图中创建会话的问题
- bash - 如何将环境变量保存到文件
- c++ - 虚幻引擎 4 事件系统如何工作?