ここまでは、整数はint、実数はfloat、文字はcharを使用すると説明していました。このページではC言語で扱うことのできる基本型とそのデータ表現を解説します。
基本型の種類
C言語(ANSI-C)で扱うことのできる基本型は以下の通りです。
型名 | バイト数 | 説明 |
---|---|---|
char | 1 | 文字型/整数型 |
short | 2 | 整数型 |
int | 4 | 整数型 |
long | 4 | 整数型 |
long long | 8 | 整数型 |
float | 4 | 浮動小数点型 |
double | 8 | 浮動小数点型 |
整数型にはsigned / unsigned を修飾できます。例えばsigned intは符号付き整数型、unsigned intは符号なし整数型となります。符号付は負の数を表現できます。符号なしは負の数を表現できませんが、正の数の表現幅が大きくなります。
また、上表で示している型毎のバイト数は、環境(プロセッサやコンパイラ)によって異なりますが、一般的な32bit環境では表のとおりになります。64bit環境ではlong型が8バイトになります。
整数型のデータフォーマット
1バイト(8bit)のchar型で説明します。
unsigned char型の場合は下図のように、8bit全てがデータbitとなります。
2進数で表現すると00000000~11111111まで、16進数で表現すると0x00~0xFFまで、10進数で表現すると0~255まで表現可能です。
signed char型の場合は下図のように、最上位bitが符号bit、下位7bitがデータbitとなります。
符号bitが0のときが正の数、1のときが負の数になります。つまり、正の数の表現範囲は、2進数では00000000~01111111、16進数では0x00~0x7F、10進数では0~127になり、負の数の表現範囲は、2進数では11111111~10000000、16進数では0xFF~0x80、10進数では-1~-128となります。
負の数の表現は、正の数をビット反転させて+1します。
例えば-1の表現は、00000001をビット反転して11111110、さらに+1して11111111となります。16進数で表現すると0xFFです。一番大きな負の値(-128)は0x80となります。
実際に書いて動かしてみましょう。
#include <stdio.h>
int main(void)
{
unsigned char uc;
signed char sc;
uc = 0xFF;
printf("uc = %d\n", uc);
sc = 0x7F;
printf("sc = %d\n", sc);
sc = 0xFF;
printf("sc = %d\n", sc);
sc = 0x80;
printf("sc = %d\n", sc);
return 0;
}
uc = 255
sc = 127
sc = -1
sc = -128
浮動小数点型のデータフォーマット
4バイト(32bit)のfloat型で説明します。
浮動小数点型は整数型とは異なり複雑なフォーマットとなっています。なので覚えなくてもいいのですが、全ての実数を表現できるわけではないと言うことだけ覚えておきましょう。ここ、よく分からずに使っている人が多い気がしています。(汗)
フォーマットは、最上位の1bitが符号bit、次の8bitが指数部、下位23bitが仮数部となります。次の計算式で表現します。