こんにちは、wattak777です。
前回の投稿 で、プログラミングデータモデルのことを少し記載しましたが、そもそもの話をしていなかったので今回はそれをネタにします。
##プログラミングデータモデルとは
C/C++に限った話ではないかもしれませんが、変数のデータ型のサイズを指します。
プラットフォームのCPUのスペックに依存して変わります。
幾つかのモデルがありますが、主に以下があります。
データモデル | char型ビット数 | short型ビット数 | int型ビット数 | long型ビット数 | ポインタ型ビット数 | 主なプラットフォーム |
---|---|---|---|---|---|---|
LLP64 | 8 | 16 | 32 | 32 | 64 | Win64 |
ILP32 | 8 | 16 | 32 | 32 | 32 | 32bit Unix/Linux |
LP64 | 8 | 16 | 32 | 64 | 64 | 64bit Unix/Linux |
ILP64 | 8 | 16 | 64 | 64 | 64 | 64bit Unix/Linux |
##整数型について
表の太字になっている箇所がポイントです。
intとlongはサイズが同じ1、という形で覚えたりするとこれに陥るのですが、処理系が変わるとビットが変わるので注意が必要です。
ご存知の方は自明の話ですがintやlong、はたまたshortやchar2といった各データ型のビット数は処理系依存でして、明確にサイズが定義されている訳ではありません。そのため上記のようなデータモデルのサイズが変わる場合があります。
##解決策、というより、こうしましょう的なお話
stdint.hをincludeして(u)int8_t/(u)int16_t/(u)int32_t/(u)int64_t3を使い、使用する変数の範囲を元にビット数を明記したデータ型で定義する、だけです。4
データモデルが変わることはそうないとは思いますが、扱いたい値の範囲を明示することでソースの可読性も上がる、と筆者は考えています。
##参考文献
2016年、C言語はどう書くべきか
原文は How to C (as of 2016)