2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Cのデータモデルについて

Last updated at Posted at 2021-01-04

こんにちは、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)

  1. この認識だったためかデータモデルでサイズ変わるよ、というと驚く知り合いが結構居ました…。

  2. charは「1バイト」と定義されていますがビット数は定義されていません。その後1バイト=8ビットになりましたが…。

  3. uが入ると符号なし、uがないと符号あり。

  4. 参考文献にもありますがintを要求するqsort、longを要求するftellといった例外はあります。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?