5

次のコードがあります。

#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 を返します

誰かが説明してもらえますか?なぜ2つに違いがあるのですか? このような定数は、コンパイラに関係なく同じであると予想していました。

4

3 に答える 3

10

Visual C ++ 2008がに戻る18場合std::numeric_limits<unsigned long long>::digits10、それはバグです(説明されている動作を確認するためにVisual C ++ 2008をインストールしていません)。

Visual C ++(少なくとも32ビットおよび64ビットWindowsの場合)では、は64ビットの符号なし整数型であり、0から18,446,744,073,709,551,615(2 64-1unsigned long long)までのすべての整数を表すことができます。

したがって、ここでの正しい値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を出力します。

于 2011-05-08T06:48:03.370 に答える
0

一般的に、ステートメント

このような定数は、コンパイラに関係なく同じであると予想していました。

正解です。C の型のサイズは固定されていません。標準は最小制限のみを義務付けており、コンパイラはより広い型を自由に使用できます。たとえば、32 ビットまたは 64 ビットのコンピュータの奇妙なコンパイラの中には、64 ビットを使用していたりCHAR_BIT = 9​​、unsigned long longそうでなかったりするものや、別の 1 の補数やその他の数値エンコーディングを使用するものがあります。つまり、コンパイラによって結果が異なる場合があります。

ただし、それunsigned long longが 64 ビット タイプの場合は、間違いなくバグです。確認したところ、VS 2008 でバグが修正されていることがわかりました。正しい値 19 が返されます。

于 2014-01-16T06:55:46.337 に答える
0

numeric_limits::digits10は、精度を落とさずに表現できる小数点の左側の 10 進数の桁数を指定します。したがって、実装の詳細に応じて、コンパイラごとに異なると思います。

于 2011-05-08T06:26:43.867 に答える