【C言語】整数型

変数を扱うに当たって、重要なのは変数が扱える値の範囲を意識することです。

データ型によって、変数が扱える値の範囲が変わります。

その基準がその型がどれだけのバイトサイズか、と言うことで決まります。

こんな検証用のコードを書きました。

sizeof()というのは、型で使用するデータサイズを計算してくれます。単位はバイトです。

実行結果はこうなりました。


1バイトというのは8ビット、8個の0/1でデータを表現しています。

さらに、signedとunsignedというのがあり、signedというのは、符号付き、という意味で、マイナスの値を表すのに1ビットを使用します。

それぞれの型が表現できる型は、以下の式で表現できます。

・符号付き(signed)の場合(nはビット数)

-2^(n-1) ~ (2^(n-1))-1

・符号無し(unsigned)の場合(nはビット数)

0 ~ 2^n-1

charを例に取れば、扱える値の範囲は-128~127、ということになります。

では、この範囲を超えてしまう場合はどうなるのでしょうか?

こんなコードを書いてみました。

charが扱える最大値に+1しました。

実行結果はこうなります。

これはどういうことかというと、+1することによってcharが扱えるデータの範囲を超えてしまったため、入りきらずに溢れたデータは消失してしまいます。

その結果、データの値的にはcharの一番小さな値になります。これは、ロールオーバーと呼んでいます。

小さな値を扱うには問題無いかと思いますが、大きな値を扱う場合は、データ型がどこまで扱えるか、というのを意識しなければなりません。

その意識が漏れてしまうと、想定外の値となってしまい、それが原因で、バグが発生してしまいます。

プログラムを設計する場合は扱えるデータの範囲とロールオーバーを意識しなければなりません。

それを解決するには、16進数、10進数、2進数の変換をスムーズに行えなければ難しいでしょう。

10進数への変換は電卓アプリに任せるとして、16進数と2進数の変換はプログラマーなら覚えておくべきです。

16進数 2進数 10進数
0x0 → 0000b → 0
0x1 → 0001b → 1
0x2 → 0010b → 2
0x3 → 0011b → 3
0x4 → 0100b → 4
0x5 → 0101b → 5
0x6 → 0110b → 6
0x7 → 0111b → 7
0x8 → 1000b → 8
0x9 → 1001b → 9
0xA → 1010b → 10
0xB → 1011b → 11
0xC → 1100b → 12
0xD → 1101b → 13
0xE → 1110b → 14
0xF → 1111b → 15

こんな感じでテンプレートみたいに覚えておくと、後々役に立ちます。

16進数の0~Fを2進数の0/1に置き換えれば簡単に変換出来ますので。

例えばunsigned char型なら最大値が0xFF(1バイト)なので、2進数に変換すると0x11111111となります。