为什么这个 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 % 4294967295
是 3633002191L
。然而,当我 运行 你的程序时,我得到 1412716852
。发生这种情况是因为程序格式错误,不幸的是,编译器不会发出错误(标准没有强制要求),而只会发出警告。
一个无符号的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 % 4294967295
是 3633002191L
。然而,当我 运行 你的程序时,我得到 1412716852
。发生这种情况是因为程序格式错误,不幸的是,编译器不会发出错误(标准没有强制要求),而只会发出警告。