1. ホーム
  2. C++

C言語におけるint8_t, int16_t, int32_t, int64_t, uint8_t, size_t, ssize_tの相違点

2022-02-21 10:28:53

int8_t, int16_t, int32_t, int64_t, uint8_t, size_t, ssize_t などのデータ型は業務でよく遭遇するので、整理しておく必要があります。

int_tのような

int_tは構造体の注釈で、type/typedefの省略形と理解でき、typedefで定義されていること、新しいデータ型でないことを示します。クロスプラットフォームのため、プラットフォームが異なれば単語の長さも異なるので、プリコンパイルとtypedefを使うことで最も効率的にコードをメンテナンスすることができます。

  •  int8_t : typedef signed char;
  •  uint8_t : unsigned char の typedef です。
  •  int16_t : typedef signed short ;
  •  uint16_t : typedef unsigned short ;
  •  int32_t : typedef signed int;
  •  uint32_t : typedef unsigned int;
  •  int64_t : typedef signed long long;
  •  uint64_t : typedef unsigned long long long;
<テーブル 指定子 一般的な等価物 符号化 ビット バイト 最小値 最大値
int8_t
signed char
署名入り 8 1 -128 127
uint8_t
unsigned char
無記名 8 1 0 255
int16_t
short
署名入り 16 2 -32,768 32,767
uint16_t
unsigned short
無記名 16 2 0 65,535
int32_t
int
署名入り 32 4 -2,147,483,648 2,147,483,647
uint32_t
unsigned int
無記名 32 4 0 4,294,967,295
int64_t
long long
署名入り 64 8 -9,223,372,036,854,775,808 9,223,372,036,854,775,807
uint64_t
unsigned long long
無記名 64 8 0 18,446,744,073,709,551,615

size_tとssize_t

size_tは主にカウントに使われ、例えばsizeof関数はsize_tの値を返します。また、size_tは符号なし、ssize_tは符号ありで、ビット数により使い分けられます。

  • 32 ビットマシンでは次のように定義されます。 typedef unsigned int size_t; (4 bytes)
  • 64 ビットマシンでは typedef unsigned long size_t; (8 バイト)として定義される。

size_tは符号なし数なので 変数が負になる可能性がある場合は、ssize_t を使用しなければなりません。 . なぜなら、符号付き整数と符号なし整数が演算されるとき、まず符号付き整数が自動的に符号なしに変換されるからです。

int main()
{
    unsigned short a;
    short int b = -1;
    a = b;
    cout << "b=" << b << endl; //b=-1
    cout << "a=" << a << endl; //a=65535
}

また、intは32ビットマシンでも64ビットマシンでも符号付きで4バイトなので、size_tとintの違いがよくわかりますね。