unsigned long 不能容纳超过 2,147,483,647 的正确数字

Aki*_*iya 4 c++

源代码:

#include <iostream>
using namespace std;
int main() {
        unsigned long P;

        P = 0x7F << 24;
        cout << P << endl;

        P = 0x80 << 24;
        cout << P << endl;

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

2130706432
18446744071562067968
Run Code Online (Sandbox Code Playgroud)

如您所见,第一个结果是正确的。但是第二个结果是极其错误的。预期结果为 2147483648,与 18446744071562067968 不匹配。

我想知道为什么

Kon*_*lph 10

表达式的类型0x80 << 24不是unsigned long,而是int。然后将该表达式的结果分配给P,并在此过程中将其转换为unsigned long。但那时它已经溢出(顺便导致未定义的行为)。unsigned long在表达式中使用文字:

P = 0x80ul << 24;
Run Code Online (Sandbox Code Playgroud)