首页 > 解决方案 > 为什么 -INT_MIN 对于 uint64_t 类型不是 2147483648

问题描述

我理解的结果p。有人可以解释为什么up2 (uint64_t type) != 2147483648 但是up (uint32_t type) == 2147483648

有人提到将 -INT_MIN 分配给无符号整数 up2 会导致溢出,但是

  1. -INT_MIN已经是一个正数,所以可以将它分配给uint64_t up2?

  2. -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)???
    

标签: c++

解决方案


的行为在 2 的补码系统上int p = -n;未定义的(接受你的问题中有错字;INT_MAX在这样的系统上总是很奇怪),因为你溢出了一个int类型。所以你的整个程序是未定义的。

这就是为什么您在许多库中看到的INT_MIN定义。-INT_MAX - 1


推荐阅读