hermemo-エルメモ-

C/C++ 変数の型 保持範囲は間違っている?

time 2017/02/09

C/C++ 変数の型 保持範囲は間違っている?

言語は何であれプログラミングをした事がある人が一度は使ったことがある変数。もちろんCやC++にも変数があります。では、それらの変数は一体どのくらいまでの値を保存できるのでしょうか?

sponsored link

間違った常識

まずは間違った知識です。完全に間違っているわけではありませんが、以下のような知識は十分ではありません。

今回は[int], [long int], [long long int]についてついてのみ書きます。[char], [short]はどのアーキテクスチャでも同じです。

C/C++での上記の3つの変数は環境によって保持範囲が異なります。

LP32ILP32LLP64LP64ILP64
搭載OSほぼ未実装32bitOS(windows, Unix系)64bit Windows64bit Unix系ほぼ未実装
int2[Byte] 16[bit]4[byte] 32[bit]4[byte] 32[bit]4[byte] 32[bit] 8[byte] 64[bit]
long4[byte] 32[bit]4[byte] 32[bit]4[byte] 32[bit]8[byte] 64[bit] 8[byte] 64[bit]
long long8[byte] 64[bit]8[byte] 64[bit]8[byte] 64[bit] 8[byte] 64[bit] 8[byte] 64[bit]

Unix系64bitOSでlong型を使った場合64bitWindowsではオーバーフローを起こす場合があります。基本的に大きな値を使用しない場合は問題ないのですが、大きな値を使用する場合は注意が必要となります。

安全に変数を使う

環境に依存して、保持範囲が変わる変数…どのように使えば良いのでしょう?
C99とC++11では、すでに対策されています。
それは、新しい変数。新しいと言っても保持範囲は変わりません。ただ、環境には依存しません。
もし、大きな値を扱う時は以下のような変数を使いましょう。

変数名保持範囲
int8_t/uint8_t1[byte] 8[bit]
int16_t/uint16_t2[byte] 16[bit]
int32_t/uint32_t4[byte] 32[bit]
int64_t/uint64_t8[byte] 64[bit]
intptr_t/uintptr_tポインタ型 32bit/64bit※

※OSのbit数と同じ。
[u]は[unsigned]型で符号なしのことである。

最後に

変数の認識違いでオーバーフローしてプログラムが停止するなんて事は起こって欲しくないものです。今後は変数の保持範囲にも注目してプログラミングしましょう。

sponsored link

down

コメントする




*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)



sponsored link