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の違いがよくわかりますね。
関連
-
vs2015 はソースファイル stdio.h を見つけることができない 解決策
-
error: 'vector' does not name a type
-
C++ - 文字列クラス超詳細紹介
-
gcc/g++ コンパイル時のエラー解析で期待される型指定子の前に
-
C++] error: 'const xxx' を 'this' 引数として渡すと修飾子が破棄される [-fpermissive] [C++] error: 'const xxx' を 'this' 引数として渡すと修飾子が破棄される。
-
const char*' から 'char*' への変換が無効です。
-
警告: この関数では 'p' が初期化されていない状態で使用されることがあります。
-
一意でないテーブル/エイリアス
-
"エラー:不完全なクラス型へのポインタは許可されません。"の前方宣言。
-
C++によるhttpサーバー/webサーバーの作成
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C++ std::string は NULL で初期化できない、基本的な使い方
-
C++ JSON ライブラリ jsoncpp 新 API の使用法 (CharReaderBuilder / StreamWriterBuilder)
-
c++11の機能を含むcmakeの書き方 (-std=c++11 cmakeList.txtに書き込む方法)
-
エラー: コンストラクタ、デストラクタ、または '.' トークンの前に型変換が必要です。
-
c++ experience summary(1):linux c compile with warning: assign makes pointer from integer without cast reason.
-
c++ 11 random ライブラリの簡単な使い方
-
[エラー]'cout' はこのスコープで宣言されていません。
-
ベクター使用時、ベクター添え字が範囲外、その他類似のエラーが発生する。
-
ベクトル添え字が範囲外のコンテナの使用、その他類似のエラー
-
c++は、ダブルフリーまたは破損(fasttop)が表示されます。