標準では、char
以外の整数型の正確なサイズについて何も述べていません。 .通常、long
32 ビット システムでは 32 ビット、64 ビット システムでは 64 ビットです。
ただし、標準では最小値が指定されています サイズ。 C 標準のセクション 5.2.4.2.1 から:
<ブロック引用>
1 以下に示す値は、#if
での使用に適した定数式に置き換えられます。 前処理ディレクティブ。また、CHAR_BIT
を除く と MB_LEN_MAX
、以下は、整数昇格に従って変換された対応する型のオブジェクトである式と同じ型を持つ式に置き換えられます。 それらの実装定義の値は、同じ符号で示されたものと同じかそれ以上の大きさ (絶対値) でなければなりません。
...
-
タイプ
long int
のオブジェクトの最小値LONG_MIN
-2147483647 // −(2^31−1) -
タイプ
long int
のオブジェクトの最大値LONG_MAX
+2147483647 // 2^31−1
これは、long int
しなければならない 最小値は 32 ビットですが、それより大きくなる場合があります。 CHAR_BIT
のマシンで が 8 の場合、最小バイト サイズは 4 になります。 CHAR_BIT
16 に等しい、long int
長さは 2 バイトです。
これが実際の例です。次のコードの場合:
#include <stdio.h>
int main ()
{
printf("sizeof(long) = %zu\n", sizeof(long));
return 0;
}
Debian 7 i686 での出力:
<ブロック引用>sizeof(ロング) =4
CentOS 7 x64 での出力:
<ブロック引用>sizeof(ロング) =8
いいえ、サイズについて推測することはできません。特定のサイズのタイプが必要な場合は、stdint.h
で定義されているタイプを使用できます。 .次のタイプを定義します:
int8_t
:符号付き 8 ビットuint8_t
:符号なし 8 ビットint16_t
:符号付き 16 ビットuint16_t
:符号なし 16 ビットint32_t
:署名付き 32 ビットuint32_t
:符号なし 32 ビットint64_t
:署名付き 64 ビットuint64_t
:符号なし 64 ビット
stdint.h
ヘッダーは標準のセクション 7.20 で説明されており、正確な幅のタイプはセクション 7.20.1.1 で説明されています。標準では、これらの typedef はオプションであると規定されていますが、ほとんどの実装に存在します。
いいえ、C 標準も POSIX もこれを保証しておらず、実際、ほとんどの Unix ライクな 64 ビット プラットフォームには 64 ビット (8 バイト) long
があります。 .