PR

【C・C++】データ型とは?【型変換・オーバーフロー】

アイキャッチ C++
この記事は約4分で読めます。

データ型に関しての記事です。
型変換やオーバーフローについても解説しています。

のんびり丸

WEBアプリの開発等をしています。
日々の学習の備忘録として運営していこうと思います。

のんびり丸をフォローする

整数型

型の名前入る値の範囲サイズ【ビット数】
unsigned short (int)0 ~ 6553516
short (int)-32768 ~ 3276816
unsigned (int)0 ~ 429496729532
int-2147483648 ~ 214748364832
unsigned long (int)0 ~ 429496729532
long (int)-2147483648 ~ 214748364832
unsigned char0 ~ 2558
char-128 ~ 1278

整数型は、上記のような種類があります。

(int)としているのは、intを省略して記述することが出来るということです。
long型とint型は、入る値の範囲が同様なので、わざわざ覚える必要ないのかな?

unsigned:符号なし
charは、【チャー】もしくは【キャラ】と読みます。

実数型

型の名前入る値の範囲サイズ【ビット数】
float-3.4*10^38 ~ 3.4*10^3832
double-1.7*10^308 ~ 1.7*10^30864

実数型は、上記のような種類があります。

プログラミングをしていると、浮動小数点という言葉をよく耳にします。
浮動小数点を簡単に説明すると、【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型

型の名前入る値の範囲サイズ【ビット数】
booltrue / false8

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 };
タイトルとURLをコピーしました