1

私はdouble long64ビットコンピューターで使用していsizeof(double long)ます16 bytes。だから私は次の割り当てを行います:

  long double f = 0xA0000000000000000000000000000000; // 32 characters in hex

そして私はこの警告を受け取ります:warning: integer constant is too large for its type。その警告は正しくないようです。私の定数は128ビット値で簡単に保存できます。では、なぜ警告が表示されるのですか?

私もこのコードを持っています:

  long double tmp = 0x90000000CCCCCCCC0000000000000000;
  long double res = (f & tmp);  // where f is the previously defined variable

次のエラーが発生しますerror: invalid operands to binary &。なんで ?

4

3 に答える 3

2
error: invalid operands to binary &

fとは整数ではなく浮動小数点数であるためtmp、 binary の引数として使用できません&

long double f = 0xA0000000000000000000000000000000

浮動小数点変数を整数定数で初期化しています。それ自体は問題ありませんが、整数定数には独自の型があり、最大の整数型と同じ大きさにすることができます (コンパイラが適合する型を選択します)。コンパイラの最大の整数型が 128 ビット未満の場合、これは機能しません。

ところで、それは128ビット表現を持っているsizeof(double long) == 16という意味ではありません。long double

于 2012-02-13T11:35:52.940 に答える
1

0xA0000000000000000000000000000000は整数定数であり、システムによってはサポートされない場合があります。整数定数のより大きな型はunsigned long longであり、システムで の幅unsigned long longが 64 ビットの場合、この定数は適合しません。

できることは、16 進整数定数の代わりに16 進浮動定数を使用することです。

long double f = 0xA0000000000000000000000000000000p0L;
                                                  ^^ the exponent is 0

大丈夫です。

p指数を導入し (必須)、Lはそれがlong doubleリテラルであることを示します (デフォルトは ですdouble)。

16 進浮動定数は C99 の追加であり、16 進浮動定数では指数部が必要であることに注意してください。

ビット単位の演算子 (質問の 2 番目の部分) に関しては、ビット単位の演算子のオペランドは整数型でなければならないため、浮動小数点値に対してビット単位の演算を実行することはできません。

于 2012-02-13T13:00:29.530 に答える
1

私のコメントを展開する:

long double浮動小数点型です。そのため、それらに対してビット単位の演算子を実行することはできません。

残念ながら、標準は 128 ビットの整数型を保証していません。私が知っている唯一のコンパイラは、拡張機能として実際にサポートしているのは__int128 経由の GCC です。(編集:常にサポートしているとは限りません。)

MSVC にも__int128型がありますが、予約済みで未実装のままです。

ビット単位の演算のみを行う場合は、2 つの 64 ビット整数を含む構造体を使用できます。または、x86 を使用している場合は、128 ビット SSE データ型を使用できます。

于 2012-02-13T11:38:09.520 に答える