我有以下代码:
#include <iostream>
#include <limits>
int main()
{
std::cout << std::numeric_limits<unsigned long long>::digits10 << std::endl;
return 0;
}
有人可以解释为什么两者之间有区别?无论编译器如何,我都希望这样的常量是相同的。
答案 0 :(得分:10)
如果Visual C ++ 2008为18
返回std::numeric_limits<unsigned long long>::digits10
,那就是一个错误(我没有安装Visual C ++ 2008来验证所描述的行为)。
在Visual C ++中(至少对于32位和64位Windows),unsigned long long
是64位无符号整数类型,能够表示零到18,446,744,073,709,551,615(2 64 - 1)。
因此,此处digits10
的正确值为19,因为unsigned long long
可代表9,999,999,999,999,999,999(19位),但不能代表99,999,999,999,999,999,999(20位数)。也就是说,它可以代表每19位数字,但不是每20位数字。
使用Visual C ++ 2010编译时,程序会打印出预期的19。
答案 1 :(得分:0)
numeric_limits :: digits10 指定可以在不损失精度的情况下表示的小数点左侧的小数位数。所以,我想根据它们的实现细节,它会因编译器而异。
答案 2 :(得分:0)
无论编译器如何,我都希望这样的常量是相同的。
这不正确。只要符合标准,编译器就可以实现任何值。例如,32位或64位计算机上的一些奇怪的编译器可能会CHAR_BIT = 9
而unsigned long long
不再是64位,或者它可能使用不同的1的补码或其他一些数字编码,所以结果可能因编译器而异。
我刚检查并且VS 2008仍然返回19.可能是因为更新时的其中一个修补程序。 VS2008 result http://imageshack.com/a/img826/6228/6qo4.png