unsigned int只能容纳32位数据.当我为它分配一个比它能容纳的值更大的值时,为什么编译器不会给出错误?
我尝试了其他各种值,但仍然没有错误.
int main() { unsigned int mem = 0x89678456543454345934; cout << mem; return 0; }
解决方法
那是因为0x89678456543454345934大于std :: numeric_limits< unsigned_int> :: max().但是,无符号类型会绕过它们的最大值,因此如果右侧可以用整数类型表示,那么您可以很好地定义行为.在这种情况下,结果是0x89678456543454345934 mod std :: numeric_limits< unsigned_int> :: max.
编辑
赋值的右侧是integer literal.为了表示它,编译器使用整数文字可以适合的第一种类型(按其大小排序).如果没有这种类型,那么程序就是格式错误.常量的十进制值是:
648873758694578209446196L
在我的机器上,对于clang和g std :: numeric_limits< unsigned long long> :: max()是18446744073709551615,它小于你的常量.看起来你的程序是不正确的,除非编译器使用超过64位代表无符号长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%4294967295是3633002191L.但是,当我运行你的程序时,我得到1412716852.这是因为程序格式错误,不幸的是编译器没有发出错误(它不是标准规定的),而只是一个警告.