GCC和MSVC之间的数字10的差异

时间:2011-05-08 06:21:14

标签: c++ visual-c++ gcc digits numeric-limits

我有以下代码:

#include <iostream>
#include <limits>

int main()
{
   std::cout << std::numeric_limits<unsigned long long>::digits10 << std::endl;
   return 0;
}
  • GCC 4.4返回19
  • MS VS 9.0返回18

有人可以解释为什么两者之间有区别?无论编译器如何,我都希望这样的常量是相同的。

3 个答案:

答案 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 = 9unsigned long long不再是64位,或者它可能使用不同的1的补码或其他一些数字编码,所以结果可能因编译器而异。

我刚检查并且VS 2008仍然返回19.可能是因为更新时的其中一个修补程序。 VS2008 result http://imageshack.com/a/img826/6228/6qo4.png