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

waz*_*eer 6 c++ memory allocation

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

我尝试了其他各种值,但仍然没有错误.

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

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

vso*_*tco 12

那是因为0x89678456543454345934大于std::numeric_limits<unsigned_int>::max().但是,unsigned类型会绕过它们的最大值,因此如果右侧可以用整数类型表示,那么您可以很好地定义行为.在那种情况下,结果是0x89678456543454345934mod std::numeric_limits<unsigned_int>::max.

编辑

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

648873758694578209446196L
Run Code Online (Sandbox Code Playgroud)

在我的机器上,对于clang ++和g ++ std::numeric_limits<unsigned long long>::max()都是18446744073709551615,它小于你的常量.看起来你的程序是不正确的,除非编译器使用超过64位代表unsigned long long,我非常怀疑.正如@juanchopanza所说,clang ++拒绝编译代码,但错误

错误:整数常量大于最大无符号整数类型

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

警告:大整数隐式截断为无符号类型

警告是相当混乱的,因为它指的是右手边,而不是进一步转换unsigned int为你得到的

警告:大整数隐式截断为无符号类型[-Woverflow]

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

  • Clang给了我一个更相关的错误:`error:integer literal太大而无法在任何整数类型中表示 (2认同)