1. ホーム
  2. c

long intのサイズは常に4バイトと考えていいのでしょうか?

2023-11-24 03:04:30

質問

常に long int (の同義語であると理解しています)。 long ) は 4 のバイトですか?

に頼っていいのでしょうか? もしそうでなければ、POSIXベースのOSではそうなる可能性がありますか?

どのように解決するのですか?

標準では、以下のような整数型の正確なサイズについては何も述べていません。 char . 典型的には long は、32 ビットシステムでは 32 ビット、64 ビットシステムでは 64 ビットです。

しかし、この規格では 最小 のサイズを指定しています。 の 5.2.4.2.1 節から、この規格は C規格 :

<ブロッククオート

1 以下に示す値は,定数表現に置き換えるものとする。 で使用するのに適した定数式に置き換える。 #if で使用するのに適した定数式に置き換えられます。 さらに を除いて CHAR_BITMB_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(long) = 4

CentOS 7 x64での出力です。

sizeof(long) = 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 で正確な幅の型が示されています。 規格では、これらの型定義はオプションであると述べていますが、ほとんどの実装で存在しています。