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
类型会绕过它们的最大值,因此如果右侧可以用整数类型表示,那么您可以很好地定义行为.在那种情况下,结果是0x89678456543454345934
mod 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 % 4294967295
是3633002191L
.但是,当我运行你的程序时,我得到了1412716852
.发生这种情况是因为程序格式不正确,遗憾的是编译器不会发出错误(标准不强制要求),而只是警告.