c++ - GCC 和 MSVC 之间的 digits10 差异

标签 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

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

最佳答案

如果 Visual C++ 2008 返回 18对于 std::numeric_limits<unsigned long long>::digits10 ,这是一个错误(我没有安装 Visual C++ 2008 来验证所描述的行为)。

在 Visual C++ 中(至少对于 32 位和 64 位 Windows),unsigned long long是 64 位无符号整数类型,能够表示 0 到 18,446,744,073,709,551,615 (264 - 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。

关于c++ - GCC 和 MSVC 之间的 digits10 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5925951/

相关文章:

c++ - C++ 预处理器是否与 C 预处理器相同?

用于包装任意函数的 C++ 模板类

c++ - 为什么会有定义_tmain 的宏?

c - Visual Studio 错误 C2226 'unexpected type'

c++ - 编译 C++ 程序时 VS 2013 中的链接时错误 - B. Stroustrup's PPP using C++ : Ch. 8 - Q1 Drill?

c++ - GCC __attribute__ 在 32 字节处对齐的 AVX 向量化代码中的段错误

gcc - 使用 GCC 进行隐式 SIMD (SSE/AVX) 广播

c++ - 显式构造函数中的类型推断

c++ - 什么是 Apple GCC 中的 WSAAsyncSelect() 函数模拟?

c++ - 为什么 Windows 在我使用 ** 时将我的目录列表注入(inject)到 argv 中?