データ型に関しての記事です。
型変換やオーバーフローについても解説しています。
整数型
型の名前 | 入る値の範囲 | サイズ【ビット数】 |
---|---|---|
unsigned short (int) | 0 ~ 65535 | 16 |
short (int) | -32768 ~ 32768 | 16 |
unsigned (int) | 0 ~ 4294967295 | 32 |
int | -2147483648 ~ 2147483648 | 32 |
unsigned long (int) | 0 ~ 4294967295 | 32 |
long (int) | -2147483648 ~ 2147483648 | 32 |
unsigned char | 0 ~ 255 | 8 |
char | -128 ~ 127 | 8 |
整数型は、上記のような種類があります。
(int)としているのは、intを省略して記述することが出来るということです。
long型とint型は、入る値の範囲が同様なので、わざわざ覚える必要ないのかな?
unsigned:符号なし
charは、【チャー】もしくは【キャラ】と読みます。
実数型
型の名前 | 入る値の範囲 | サイズ【ビット数】 |
---|---|---|
float | -3.4*10^38 ~ 3.4*10^38 | 32 |
double | -1.7*10^308 ~ 1.7*10^308 | 64 |
実数型は、上記のような種類があります。
プログラミングをしていると、浮動小数点という言葉をよく耳にします。
浮動小数点を簡単に説明すると、【123.45】を【12345×10^(-2)】のように表現することです。
文字型
型の名前 | 入る値の範囲 | サイズ【ビット数】 |
---|---|---|
char | 一文字 | - |
整数型にも存在したcharには、文字も入れることが出来ます。
ややこしい仕様ですね...
C言語で【文字】というのは、半角文字1つのことです。
日本語は複数の文字で構成されているため、文字型に入りません。
ASCIIコード【アスキーコード】
コンピュータの世界では、英数字などの文字を0~127の番号に対応させて管理しています。
この文字と文字に割り振られた番号の対応表をASCIIコード【アスキーコード】と言います。
ASCIIコードでは、'A'と65が同等と見なされるため、以下のようなことが起こります。
コーディング例①
#include <stdio.h> // printf()を使用するために必要
int main()
{
char a = 'A';
printf("%d\n", a); // 65と表示
printf("%c\n", a); // Aと表示
return 0;
}
出力
65
A
bool型
型の名前 | 入る値の範囲 | サイズ【ビット数】 |
---|---|---|
bool | true / false | 8 |
bool型は、trueとfalseを管理するためのデータ型です。
フラグの管理をする際に便利です。
void型
型の名前 | 入る値の範囲 | サイズ【ビット数】 |
---|---|---|
void | - | - |
void型は、型がないことを示します。
他の型と比較すると、少し特殊な扱いですね。
戻り値のない関数などで利用されます。
型の変換
キャスト演算子
(int)のように、型名を()で閉じたものを値や変数の前に記述すると、型の変換をすることが出来ます。
この操作を型キャストと言い、()をキャスト演算子と言います。
コーディング例①
#include <stdio.h> // printf()を使用するために必要
int main()
{
printf("10÷3=%d\n", 3 / 2);
printf("10÷3=%f\n", 3 / 2.0);
printf("10÷3=%f\n", 3 / (float)2);
printf("10÷3=%d\n", 3 / (int)2.0);
return 0;
}
出力
10÷3=1
10÷3=1.500000
10÷3=1.500000
10÷3=1
実数を含む計算の場合、計算結果も実数となります。
また、整数同士の計算では、一番範囲の広い型に変換されます。
オーバーフロー
データ型の範囲を超えた数値を代入すると、意図しない数値となってしまいます。
これをオーバーフローと言います。
コーディング例①
#include <stdio.h> // printf()を使用するために必要
int main()
{
char a = 1000;
unsigned char b = -5;
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
出力
-24
251
typedef
名称が長いデータ型は、そのままだと使い勝手が悪いです。
このような場合には、typedef【タイプデフ】を使うことで任意の名称を付けることが出来ます。
型の再定義とも言いますね。
typedef データ型 名称;
通常の型
今回の例では、【unsigned char】を【UC】という型名に変更しています。
typedef unsigned char UC;
UC a;
ポインタ型
ポインタ型の場合は、型の再定義の際に【*】を付けます。
変数の定義の際には、【*】は必要ありません。
typedef unsigned char *pUC;
pUC a;
構造体
構造体テンプレートに関しても、任意の名称を付けることが出来ます。
【typedef】を使用した場合は、変数の定義時に【struct】を使用する必要が無くなります。
※C++では、デフォルトで【struct】を省略することが出来ます。
//フルーツ構造体
typedef struct FruitStruct {
char name[10]; // 名前
int price; // 値段
int num; // 数
}Fruit;
Fruit apple = { "apple", 150, 1 };
構造体に関しては、こちらの記事でまとめています。