12

x86/amd64では世界sizeof(long long)は8です。

ZackWeinbergによる非常に洞察に満ちた8年前のメールを引用させてください。

スコットロバートラッドは書いています:

64ビットAMD64アーキテクチャでは、GCCはとlong long同じ64ビットとして定義しlongます。

特定の64ビット命令(乗算)が128ビットの結果を生成することを考えるとlong long、128ビットとして定義するのは論理的ではないでしょうか。

いいえ、2つの理由があります。

  1. 64ビット' long long'の選択は、ほとんどのLP64モデルオペレーティングシステムのABIに書き込まれています。一方的に変更することはできません。

  2. これは実際には正しい選択です。これは、' long'を最も広い基本積分タイプではないものにする収差を除去するためです。sizeof(long) >= sizeof(size_t)これは、longlongがlongよりも幅が広いABIによって少なくとも潜在的に破壊されるという仮定に基づいて書かれたコードがたくさんあります 。

    (これはC99の開発中に非常に論議を呼んだトピックでした。外部の観点から言えば、' long long'は、何らかの理由でLP64モデルを実装できないMicrosoftからの圧力により、標準化されただけです。他の誰もが嫌いでした。 ''を作成するという考えは、long必ずしも最も広い基本的な積分型ではありません。)

現在のベストプラクティスは、「拡張積分タイプ」を提供することであるように思われます__int128これは基本的なlong long積分型ではないため、''の問題はありません(特に、には使用できません )。size_t

zw


long long最も幅の広い基本一体型です。私が知っている古いアーキテクチャ/ABI以外のアーキテクチャでは64ビット長です。これにより、単純なクロスプラットフォーム(少なくとも多くの32/64ビットアーキテクチャでは)typedefを使用できます。

typedef char               s8;
typedef unsigned char      u8;
typedef short              s16;
typedef unsigned short     u16;
typedef int                s32;
typedef unsigned int       u32;
typedef long long          s64;
typedef unsigned long long u64;

それは、よりも優れていますintXX_t。理由は次のとおりです。

  • 異なるプラットフォームの64ビット整数に同じ基になる型を使用します
  • PRId64冗長な/を回避できます(Visual C ++が/をサポートしているのは2005年以降PRIu64
    であることをよく知っています)%lld%llu

しかし、このソリューションがどれほど移植性があるかは、次の質問への回答で表すことができます。


アーキテクチャ/ABIはどこにありsizeof(long long) != 8ますか?

最近/最新のものを提供できない場合は、古いものを使用してください。ただし、それらがまだ使用されている場合に限ります。

4

2 に答える 2

8

TI TMS320C55xアーキテクチャにはCHAR_BIT、16ビットとlong long40ビットがあります。40ビットlong longはISOに違反していますがsizeof (long long)、8とは異なります。

実際、ほぼすべてのC99実装にはCHAR_BIT > 8があり sizeof (long long) != 8ます。

TMS320C55x最適化C/C ++コンパイラユーザーズガイド(2003) http://www.ti.com/lit/ug/spru281f/spru281f.pdf

于 2012-07-15T12:36:49.680 に答える
-1

「クロスプラットフォーム」のtypedefは誤った方向に進んでいます。正しいものは

#include <stdint.h>
typedef int8_t s8;
typedef uint8_t u8;
typedef int16_t s16;
...
于 2012-07-26T04:50:04.067 に答える