24

これは、bignum ライブラリと C 言語への gcc 固有のハッキングに関する今日の質問から生じました。具体的には、次の 2 つの宣言が使用されました。

typedef unsigned int dword_t __attribute__((mode(DI)));

32 ビット システムおよび

typedef unsigned int dword_t __attribute__((mode(TI)));

64 ビット システムの場合。

これが C 言語の拡張であることを考えると、現在の (C99) 標準で達成されるものを達成する方法は存在しません。

だから私の質問は簡単です:その仮定は正しいですか?そして、これらのステートメントは、根底にあるメモリに何をしますか? 結果は、32 ビット システムと64 ビット システムで得2*sizeof(uint32_t)られたと思いますが、正しいですか?dword2*sizeof(uint64_t)

4

2 に答える 2

30

これらを使用すると、「long」や「int」のサイズなど、コンパイラやマシンのセマンティクスに依存せずに、型のサイズを明示的に指定できます。

それらは、このページでかなり詳しく説明されています。

そのページから引用します:

QI: アドレス指定可能な最小単位と同じ幅の整数で、通常は 8 ビットです。

HI: QI モード整数の 2 倍の整数で、通常は 16 ビットです。

SI: QI モード整数の 4 倍の整数で、通常は 32 ビットです。

DI: QI モード整数の 8 倍の整数で、通常は 64 ビットです。

SF: SI モードの整数と同じ幅の浮動小数点値で、通常は 32 ビットです。

DF: DI モードの整数と同じ幅の浮動小数点値で、通常は 64 ビットです。

DI本質的にそうですsizeof(char) * 8

TIモードを含む詳細な説明は、ここにあります(最初のリンクよりも優れている可能性がありますが、両方とも参照用に提供されています)。

TI本質的にはそうですsizeof(char) * 16(128ビット)。

于 2010-12-30T00:21:15.437 に答える
3

@haelix この質問を読んだだけで、私もこのことを理解しようとしました。私の読みによると、定義は GCC ソース ツリーの [gcc/gcc/machmode.def] にあります。「SD」の場合は次のようになります。

    /* Decimal floating point modes.  */ 
DECIMAL_FLOAT_MODE (SD, 4, decimal_single_format);

そして「DECIMAL_FLOAT_MODE」は言う:

     DECIMAL_FLOAT_MODE (MODE, BYTESIZE, FORMAT);
declares MODE to be of class DECIMAL_FLOAT and BYTESIZE bytes
wide.  All of the bits of its representation are significant.
于 2015-02-14T16:04:57.397 に答える