GNU/Linux >> Linux の 問題 >  >> Linux

long int のサイズが常に 4 バイトであると想定できますか?

標準では、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 があります。 .


Linux
  1. OpenStackエラー–インデックスの列サイズが大きすぎます。最大列サイズは767バイトです[解決済み]

  2. グラブフォントサイズはカスタマイズできますか?

  3. パーティションのセクターサイズを見つけますか?

  1. LsとHexdumpがファイルサイズについて意見が一致しないのはなぜですか?

  2. MySQLでデータベースサイズを取得する

  3. ファイル全体を読み取らずに、大きなファイルの末尾から X バイトを削除する方法は?

  1. 最大スタック サイズを確認するにはどうすればよいですか?

  2. ファイル ベースのディスク イメージのサイズを拡張できますか?

  3. ターミナルでスクロールできないのはなぜですか?