[C言語] データ型のサイズ(バイト数)や最大値・最小値の一覧【32bit/64bit】
C言語では、データ型のサイズや範囲は環境(32bit/64bit)やコンパイラに依存します。
以下は一般的な例です。
32bit環境では、char
は1バイト(\(-128\)~\(127\))、short
は2バイト(\(-32,768\)~\(32,767\))、int
は4バイト(\(-2,147,483,648\)~\(2,147,483,647\))、long
も4バイト、long long
は8バイト。
64bit環境では、long
が8バイトになる場合が多いです。
float
は4バイト、double
は8バイトが一般的です。
整数型のサイズと範囲
C++における整数型は、プログラムで数値を扱う際に非常に重要な役割を果たします。
整数型には、符号付き整数型と符号なし整数型があり、それぞれのサイズや範囲は環境によって異なります。
以下に、一般的な整数型のサイズと範囲を示します。
データ型 | サイズ (バイト) | 最小値 | 最大値 |
---|---|---|---|
char | 1 | -128 | 127 |
unsigned char | 1 | 0 | 255 |
short | 2 | -32,768 | 32,767 |
unsigned short | 2 | 0 | 65,535 |
int | 4 | -2,147,483,648 | 2,147,483,647 |
unsigned int | 4 | 0 | 4,294,967,295 |
long | 4 (32bit) / 8 (64bit) | -2,147,483,648 (32bit) / -9,223,372,036,854,775,808 (64bit) | 2,147,483,647 (32bit) / 9,223,372,036,854,775,807 (64bit) |
unsigned long | 4 (32bit) / 8 (64bit) | 0 | 4,294,967,295 (32bit) / 18,446,744,073,709,551,615 (64bit) |
long long | 8 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
unsigned long long | 8 | 0 | 18,446,744,073,709,551,615 |
符号付き整数型と符号なし整数型の違い
- 符号付き整数型は、負の数と正の数の両方を表現できます。
- 符号なし整数型は、0以上の数のみを表現でき、最大値が倍増します。
以下のサンプルコードでは、各整数型のサイズと範囲を表示します。
#include <iostream>
#include <limits> // 数値の最大値・最小値を取得するためのヘッダ
int main() {
std::cout << "charのサイズ: " << sizeof(char) << " バイト, 最小値: " << (int)std::numeric_limits<char>::min() << ", 最大値: " << (int)std::numeric_limits<char>::max() << std::endl;
std::cout << "unsigned charのサイズ: " << sizeof(unsigned char) << " バイト, 最小値: " << (int)std::numeric_limits<unsigned char>::min() << ", 最大値: " << (int)std::numeric_limits<unsigned char>::max() << std::endl;
std::cout << "shortのサイズ: " << sizeof(short) << " バイト, 最小値: " << std::numeric_limits<short>::min() << ", 最大値: " << std::numeric_limits<short>::max() << std::endl;
std::cout << "unsigned shortのサイズ: " << sizeof(unsigned short) << " バイト, 最小値: " << std::numeric_limits<unsigned short>::min() << ", 最大値: " << std::numeric_limits<unsigned short>::max() << std::endl;
std::cout << "intのサイズ: " << sizeof(int) << " バイト, 最小値: " << std::numeric_limits<int>::min() << ", 最大値: " << std::numeric_limits<int>::max() << std::endl;
std::cout << "unsigned intのサイズ: " << sizeof(unsigned int) << " バイト, 最小値: " << std::numeric_limits<unsigned int>::min() << ", 最大値: " << std::numeric_limits<unsigned int>::max() << std::endl;
std::cout << "longのサイズ: " << sizeof(long) << " バイト, 最小値: " << std::numeric_limits<long>::min() << ", 最大値: " << std::numeric_limits<long>::max() << std::endl;
std::cout << "unsigned longのサイズ: " << sizeof(unsigned long) << " バイト, 最小値: " << std::numeric_limits<unsigned long>::min() << ", 最大値: " << std::numeric_limits<unsigned long>::max() << std::endl;
std::cout << "long longのサイズ: " << sizeof(long long) << " バイト, 最小値: " << std::numeric_limits<long long>::min() << ", 最大値: " << std::numeric_limits<long long>::max() << std::endl;
std::cout << "unsigned long longのサイズ: " << sizeof(unsigned long long) << " バイト, 最小値: " << std::numeric_limits<unsigned long long>::min() << ", 最大値: " << std::numeric_limits<unsigned long long>::max() << std::endl;
return 0;
}
charのサイズ: 1 バイト, 最小値: -128, 最大値: 127
unsigned charのサイズ: 1 バイト, 最小値: 0, 最大値: 255
shortのサイズ: 2 バイト, 最小値: -32768, 最大値: 32767
unsigned shortのサイズ: 2 バイト, 最小値: 0, 最大値: 65535
intのサイズ: 4 バイト, 最小値: -2147483648, 最大値: 2147483647
unsigned intのサイズ: 4 バイト, 最小値: 0, 最大値: 4294967295
longのサイズ: 4 バイト, 最小値: -2147483648, 最大値: 2147483647
unsigned longのサイズ: 4 バイト, 最小値: 0, 最大値: 4294967295
long longのサイズ: 8 バイト, 最小値: -9223372036854775808, 最大値: 9223372036854775807
unsigned long longのサイズ: 8 バイト, 最小値: 0, 最大値: 18446744073709551615
このように、C++の整数型はそれぞれ異なるサイズと範囲を持っており、プログラムの要件に応じて適切な型を選択することが重要です。
浮動小数点型のサイズと範囲
C++における浮動小数点型は、実数を扱うためのデータ型であり、特に小数点を含む数値を表現する際に使用されます。
浮動小数点型には、float
、double
、およびlong double
の3つの主要な型があります。
それぞれのサイズと範囲は、環境によって異なる場合がありますが、一般的な情報を以下に示します。
データ型 | サイズ (バイト) | 最小値 (近似) | 最大値 (近似) |
---|---|---|---|
float | 4 | 1.175494e-38 | 3.402823e+38 |
double | 8 | 2.2250738585072014e-308 | 1.7976931348623157e+308 |
long double | 8 (32bit) / 16 (64bit) | 3.362103143112093e-4932 (64bit) | 1.189731495357231765021263853030e+4932 (64bit) |
浮動小数点型の特徴
- 精度:
float
は単精度、double
は倍精度、long double
はさらに高精度を提供します。 - 範囲: 浮動小数点型は非常に大きな数や非常に小さな数を表現できるため、科学技術計算などで広く使用されます。
- 丸め誤差: 浮動小数点数は、計算結果に丸め誤差が生じることがあります。
特に、非常に大きな数や非常に小さな数を扱う際には注意が必要です。
以下のサンプルコードでは、各浮動小数点型のサイズと範囲を表示します。
#include <iostream>
#include <limits> // 数値の最大値・最小値を取得するためのヘッダ
int main() {
std::cout << "floatのサイズ: " << sizeof(float) << " バイト, 最小値: " << std::numeric_limits<float>::min() << ", 最大値: " << std::numeric_limits<float>::max() << std::endl;
std::cout << "doubleのサイズ: " << sizeof(double) << " バイト, 最小値: " << std::numeric_limits<double>::min() << ", 最大値: " << std::numeric_limits<double>::max() << std::endl;
std::cout << "long doubleのサイズ: " << sizeof(long double) << " バイト, 最小値: " << std::numeric_limits<long double>::min() << ", 最大値: " << std::numeric_limits<long double>::max() << std::endl;
return 0;
}
floatのサイズ: 4 バイト, 最小値: 1.17549e-38, 最大値: 3.40282e+38
doubleのサイズ: 8 バイト, 最小値: 2.22507e-308, 最大値: 1.79769e+308
long doubleのサイズ: 16 バイト, 最小値: 3.3621e-4932, 最大値: 1.18973e+4932
このように、C++の浮動小数点型は、数値計算において非常に重要な役割を果たします。
プログラムの要件に応じて、適切な浮動小数点型を選択することが求められます。
32bit環境でのデータ型の具体例
32bit環境では、データ型のサイズや範囲が特定の値に固定されており、プログラムの設計や実装において重要な要素となります。
以下に、32bit環境における主要なデータ型の具体例を示します。
データ型 | サイズ (バイト) | 最小値 | 最大値 |
---|---|---|---|
char | 1 | -128 | 127 |
unsigned char | 1 | 0 | 255 |
short | 2 | -32,768 | 32,767 |
unsigned short | 2 | 0 | 65,535 |
int | 4 | -2,147,483,648 | 2,147,483,647 |
unsigned int | 4 | 0 | 4,294,967,295 |
long | 4 | -2,147,483,648 | 2,147,483,647 |
unsigned long | 4 | 0 | 4,294,967,295 |
long long | 8 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
unsigned long long | 8 | 0 | 18,446,744,073,709,551,615 |
C/C++の規格でlong long
は最低でも64ビットのサイズを持つように定められているためです。32bit環境だからといって、この規格が変わるわけではありません。
32bit環境では、CPUが一度に処理できるデータは32ビットまでですが、long long
のような大きなデータ型は、内部的に複数の処理に分割して扱われます。
たとえ32bit環境でも、64ビット以上の整数を扱う必要性は存在します。long long
は、そのような状況に対応するために用意されたデータ型なのです。
32bit環境におけるデータ型の特徴
- メモリ使用量: 32bit環境では、各データ型のサイズが固定されているため、メモリの使用量を予測しやすいです。
- 整数型の選択: プログラムの要件に応じて、符号付き整数型と符号なし整数型を使い分けることが重要です。
符号なし整数型は、より大きな正の値を扱うことができます。
- 浮動小数点型の精度: 浮動小数点型は、科学技術計算や金融計算などで広く使用されますが、精度に注意が必要です。
特に、float
型は精度が低いため、double
型を使用することが推奨されます。
以下のサンプルコードでは、32bit環境における各データ型のサイズと範囲を表示します。
#include <iostream>
#include <limits> // 数値の最大値・最小値を取得するためのヘッダ
int main() {
std::cout << "32bit環境におけるデータ型のサイズと範囲" << std::endl;
std::cout << "charのサイズ: " << sizeof(char) << " バイト, 最小値: " << (int)std::numeric_limits<char>::min() << ", 最大値: " << (int)std::numeric_limits<char>::max() << std::endl;
std::cout << "unsigned charのサイズ: " << sizeof(unsigned char) << " バイト, 最小値: " << (int)std::numeric_limits<unsigned char>::min() << ", 最大値: " << (int)std::numeric_limits<unsigned char>::max() << std::endl;
std::cout << "shortのサイズ: " << sizeof(short) << " バイト, 最小値: " << std::numeric_limits<short>::min() << ", 最大値: " << std::numeric_limits<short>::max() << std::endl;
std::cout << "unsigned shortのサイズ: " << sizeof(unsigned short) << " バイト, 最小値: " << std::numeric_limits<unsigned short>::min() << ", 最大値: " << std::numeric_limits<unsigned short>::max() << std::endl;
std::cout << "intのサイズ: " << sizeof(int) << " バイト, 最小値: " << std::numeric_limits<int>::min() << ", 最大値: " << std::numeric_limits<int>::max() << std::endl;
std::cout << "unsigned intのサイズ: " << sizeof(unsigned int) << " バイト, 最小値: " << std::numeric_limits<unsigned int>::min() << ", 最大値: " << std::numeric_limits<unsigned int>::max() << std::endl;
std::cout << "longのサイズ: " << sizeof(long) << " バイト, 最小値: " << std::numeric_limits<long>::min() << ", 最大値: " << std::numeric_limits<long>::max() << std::endl;
std::cout << "unsigned longのサイズ: " << sizeof(unsigned long) << " バイト, 最小値: " << std::numeric_limits<unsigned long>::min() << ", 最大値: " << std::numeric_limits<unsigned long>::max() << std::endl;
std::cout << "long longのサイズ: " << sizeof(long long) << " バイト, 最小値: " << std::numeric_limits<long long>::min() << ", 最大値: " << std::numeric_limits<long long>::max() << std::endl;
std::cout << "unsigned long longのサイズ: " << sizeof(unsigned long long) << " バイト, 最小値: " << std::numeric_limits<unsigned long long>::min() << ", 最大値: " << std::numeric_limits<unsigned long long>::max() << std::endl;
return 0;
}
32bit環境におけるデータ型のサイズと範囲
charのサイズ: 1 バイト, 最小値: -128, 最大値: 127
unsigned charのサイズ: 1 バイト, 最小値: 0, 最大値: 255
shortのサイズ: 2 バイト, 最小値: -32768, 最大値: 32767
unsigned shortのサイズ: 2 バイト, 最小値: 0, 最大値: 65535
intのサイズ: 4 バイト, 最小値: -2147483648, 最大値: 2147483647
unsigned intのサイズ: 4 バイト, 最小値: 0, 最大値: 4294967295
longのサイズ: 4 バイト, 最小値: -2147483648, 最大値: 2147483647
unsigned longのサイズ: 4 バイト, 最小値: 0, 最大値: 4294967295
long longのサイズ: 8 バイト, 最小値: -9223372036854775808, 最大値: 9223372036854775807
unsigned long longのサイズ: 8 バイト, 最小値: 0, 最大値: 18446744073709551615
このように、32bit環境では各データ型のサイズと範囲が明確であり、プログラムの設計において重要な情報となります。
適切なデータ型を選択することで、メモリの効率的な使用や計算の精度を向上させることができます。
64bit環境でのデータ型の具体例
64bit環境では、データ型のサイズや範囲が32bit環境とは異なり、特に整数型や浮動小数点型のサイズが大きくなることがあります。
以下に、64bit環境における主要なデータ型の具体例を示します。
データ型 | サイズ (バイト) | 最小値 | 最大値 |
---|---|---|---|
char | 1 | -128 | 127 |
unsigned char | 1 | 0 | 255 |
short | 2 | -32,768 | 32,767 |
unsigned short | 2 | 0 | 65,535 |
int | 4 | -2,147,483,648 | 2,147,483,647 |
unsigned int | 4 | 0 | 4,294,967,295 |
long | 8 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
unsigned long | 8 | 0 | 18,446,744,073,709,551,615 |
long long | 8 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
unsigned long long | 8 | 0 | 18,446,744,073,709,551,615 |
64bit環境におけるデータ型の特徴
- メモリ使用量: 64bit環境では、
long
型とlong long
型が同じサイズ(8バイト)であるため、整数型の選択肢が増えます。 - 整数型の選択: 符号付き整数型と符号なし整数型の選択が重要で、特に大きな数を扱う場合は
unsigned long long
型が有効です。 - 浮動小数点型の精度:
double
型やlong double
型は、より高い精度を提供し、科学技術計算や金融計算において重要な役割を果たします。
以下のサンプルコードでは、64bit環境における各データ型のサイズと範囲を表示します。
#include <iostream>
#include <limits> // 数値の最大値・最小値を取得するためのヘッダ
int main() {
std::cout << "64bit環境におけるデータ型のサイズと範囲" << std::endl;
std::cout << "charのサイズ: " << sizeof(char) << " バイト, 最小値: " << (int)std::numeric_limits<char>::min() << ", 最大値: " << (int)std::numeric_limits<char>::max() << std::endl;
std::cout << "unsigned charのサイズ: " << sizeof(unsigned char) << " バイト, 最小値: " << (int)std::numeric_limits<unsigned char>::min() << ", 最大値: " << (int)std::numeric_limits<unsigned char>::max() << std::endl;
std::cout << "shortのサイズ: " << sizeof(short) << " バイト, 最小値: " << std::numeric_limits<short>::min() << ", 最大値: " << std::numeric_limits<short>::max() << std::endl;
std::cout << "unsigned shortのサイズ: " << sizeof(unsigned short) << " バイト, 最小値: " << std::numeric_limits<unsigned short>::min() << ", 最大値: " << std::numeric_limits<unsigned short>::max() << std::endl;
std::cout << "intのサイズ: " << sizeof(int) << " バイト, 最小値: " << std::numeric_limits<int>::min() << ", 最大値: " << std::numeric_limits<int>::max() << std::endl;
std::cout << "unsigned intのサイズ: " << sizeof(unsigned int) << " バイト, 最小値: " << std::numeric_limits<unsigned int>::min() << ", 最大値: " << std::numeric_limits<unsigned int>::max() << std::endl;
std::cout << "longのサイズ: " << sizeof(long) << " バイト, 最小値: " << std::numeric_limits<long>::min() << ", 最大値: " << std::numeric_limits<long>::max() << std::endl;
std::cout << "unsigned longのサイズ: " << sizeof(unsigned long) << " バイト, 最小値: " << std::numeric_limits<unsigned long>::min() << ", 最大値: " << std::numeric_limits<unsigned long>::max() << std::endl;
std::cout << "long longのサイズ: " << sizeof(long long) << " バイト, 最小値: " << std::numeric_limits<long long>::min() << ", 最大値: " << std::numeric_limits<long long>::max() << std::endl;
std::cout << "unsigned long longのサイズ: " << sizeof(unsigned long long) << " バイト, 最小値: " << std::numeric_limits<unsigned long long>::min() << ", 最大値: " << std::numeric_limits<unsigned long long>::max() << std::endl;
return 0;
}
64bit環境におけるデータ型のサイズと範囲
charのサイズ: 1 バイト, 最小値: -128, 最大値: 127
unsigned charのサイズ: 1 バイト, 最小値: 0, 最大値: 255
shortのサイズ: 2 バイト, 最小値: -32768, 最大値: 32767
unsigned shortのサイズ: 2 バイト, 最小値: 0, 最大値: 65535
intのサイズ: 4 バイト, 最小値: -2147483648, 最大値: 2147483647
unsigned intのサイズ: 4 バイト, 最小値: 0, 最大値: 4294967295
longのサイズ: 8 バイト, 最小値: -9223372036854775808, 最大値: 9223372036854775807
unsigned longのサイズ: 8 バイト, 最小値: 0, 最大値: 18446744073709551615
long longのサイズ: 8 バイト, 最小値: -9223372036854775808, 最大値: 9223372036854775807
unsigned long longのサイズ: 8 バイト, 最小値: 0, 最大値: 18446744073709551615
このように、64bit環境では各データ型のサイズと範囲が異なり、特に大きな数を扱う際にはlong
やlong long
型の使用が重要です。
プログラムの要件に応じて適切なデータ型を選択することで、メモリの効率的な使用や計算の精度を向上させることができます。
データ型のサイズを確認する方法
C++では、データ型のサイズを確認するためにsizeof
演算子を使用します。
この演算子は、指定したデータ型や変数のサイズをバイト単位で返します。
以下に、データ型のサイズを確認する方法を詳しく説明します。
sizeof演算子の基本的な使い方
- 基本構文:
sizeof(type)
またはsizeof(variable)
を使用します。 - 戻り値:
sizeof
は、指定した型または変数のサイズをsize_t
型で返します。
以下のサンプルコードでは、さまざまなデータ型のサイズを確認し、出力します。
#include <iostream>
int main() {
std::cout << "データ型のサイズ確認" << std::endl;
std::cout << "charのサイズ: " << sizeof(char) << " バイト" << std::endl;
std::cout << "unsigned charのサイズ: " << sizeof(unsigned char) << " バイト" << std::endl;
std::cout << "shortのサイズ: " << sizeof(short) << " バイト" << std::endl;
std::cout << "unsigned shortのサイズ: " << sizeof(unsigned short) << " バイト" << std::endl;
std::cout << "intのサイズ: " << sizeof(int) << " バイト" << std::endl;
std::cout << "unsigned intのサイズ: " << sizeof(unsigned int) << " バイト" << std::endl;
std::cout << "longのサイズ: " << sizeof(long) << " バイト" << std::endl;
std::cout << "unsigned longのサイズ: " << sizeof(unsigned long) << " バイト" << std::endl;
std::cout << "long longのサイズ: " << sizeof(long long) << " バイト" << std::endl;
std::cout << "unsigned long longのサイズ: " << sizeof(unsigned long long) << " バイト" << std::endl;
std::cout << "floatのサイズ: " << sizeof(float) << " バイト" << std::endl;
std::cout << "doubleのサイズ: " << sizeof(double) << " バイト" << std::endl;
std::cout << "long doubleのサイズ: " << sizeof(long double) << " バイト" << std::endl;
return 0;
}
データ型のサイズ確認
charのサイズ: 1 バイト
unsigned charのサイズ: 1 バイト
shortのサイズ: 2 バイト
unsigned shortのサイズ: 2 バイト
intのサイズ: 4 バイト
unsigned intのサイズ: 4 バイト
longのサイズ: 8 バイト
unsigned longのサイズ: 8 バイト
long longのサイズ: 8 バイト
unsigned long longのサイズ: 8 バイト
floatのサイズ: 4 バイト
doubleのサイズ: 8 バイト
long doubleのサイズ: 16 バイト
注意点
- プラットフォーム依存: データ型のサイズは、コンパイラやプラットフォームによって異なる場合があります。
特にlong
型のサイズは、32bit環境では4バイト、64bit環境では8バイトになることがあります。
- 配列や構造体のサイズ: 配列や構造体のサイズを確認する場合も
sizeof
を使用できますが、配列の場合は全体のサイズが返されるため、要素数を求めるにはsizeof(array) / sizeof(array[0])
のように計算します。
このように、sizeof
演算子を使用することで、C++におけるデータ型のサイズを簡単に確認することができます。
プログラムの設計やデバッグに役立てましょう。
まとめ
この記事では、C++におけるデータ型のサイズや範囲について、32bitおよび64bit環境での具体例を通じて詳しく解説しました。
また、整数型や浮動小数点型の特徴、データ型のサイズを確認する方法についても触れました。
これらの情報を活用することで、プログラムの設計や実装においてより適切なデータ型を選択し、効率的なメモリ使用や計算精度の向上を図ることが可能です。
今後は、実際のプログラミングにおいてこれらの知識を活かし、データ型の選択に自信を持って取り組んでみてください。