x86/amd64では世界sizeof(long long)
は8です。
ZackWeinbergによる非常に洞察に満ちた8年前のメールを引用させてください。
スコットロバートラッドは書いています:
64ビットAMD64アーキテクチャでは、GCCはと
long long
同じ64ビットとして定義しlong
ます。特定の64ビット命令(乗算)が128ビットの結果を生成することを考えると
long long
、128ビットとして定義するのは論理的ではないでしょうか。いいえ、2つの理由があります。
64ビット'
long long
'の選択は、ほとんどのLP64モデルオペレーティングシステムのABIに書き込まれています。一方的に変更することはできません。これは実際には正しい選択です。これは、'
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
ますか?
最近/最新のものを提供できない場合は、古いものを使用してください。ただし、それらがまだ使用されている場合に限ります。