为什么这个 unsigned int 持有的数据多于它的内存?

Why is this unsigned int holding more data than it has memory for?

一个无符号的int只能容纳32位数据。为什么当我给它分配一个比它能容纳的更大的值时编译器不报错?

我尝试了其他各种值,仍然没有报错。

int main()
{
    unsigned int mem = 0x89678456543454345934;
    cout << mem;

    return 0;
}

那是因为 0x89678456543454345934 大于 std::numeric_limits<unsigned_int>::max()。但是,unsigned 类型环绕它们的最大值,因此如果右侧可以用整数类型表示,那么您就有了明确定义的行为。在那种情况下,结果是 0x89678456543454345934 mod std::numeric_limits<unsigned_int>::max

编辑

您作业的右侧是 integer literal。为了表示它,编译器使用整数文字可以适合的第一种类型(按其大小排序)。如果没有这样的类型,那么 程序是病式的 。您的常量的十进制值为:

648873758694578209446196L

在我的机器上,对于 clang++ 和 g++,std::numeric_limits<unsigned long long>::max()18446744073709551615,它比您的常量小。看来您的程序格式不正确,除非编译器使用超过 64 位来表示 unsigned long long,对此我深表怀疑。正如@juanchopanza 所说,clang++ 拒绝编译代码,出现错误

error: integer constant is larger than the largest unsigned integer type

g++ 然而继续编译它,只发出一个警告

warning: large integer implicitly truncated to unsigned type

这个警告非常令人困惑,因为它指的是右侧,而不是进一步转换为 unsigned int,为此你得到

warning: large integer implicitly truncated to unsigned type [-Woverflow]

在我的机器上 std::numeric_limits<unsigned int>::max()4294967295,因此 648873758694578209446196L % 42949672953633002191L。然而,当我 运行 你的程序时,我得到 1412716852。发生这种情况是因为程序格式错误,不幸的是,编译器不会发出错误(标准没有强制要求),而只会发出警告。