[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++における整数型は、プログラムで数値を扱う際に非常に重要な役割を果たします。

整数型には、符号付き整数型と符号なし整数型があり、それぞれのサイズや範囲は環境によって異なります。

以下に、一般的な整数型のサイズと範囲を示します。

データ型サイズ (バイト)最小値最大値
char1-128127
unsigned char10255
short2-32,76832,767
unsigned short2065,535
int4-2,147,483,6482,147,483,647
unsigned int404,294,967,295
long4 (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 long4 (32bit) / 8 (64bit)04,294,967,295 (32bit) / 18,446,744,073,709,551,615 (64bit)
long long8-9,223,372,036,854,775,8089,223,372,036,854,775,807
unsigned long long8018,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++における浮動小数点型は、実数を扱うためのデータ型であり、特に小数点を含む数値を表現する際に使用されます。

浮動小数点型には、floatdouble、およびlong doubleの3つの主要な型があります。

それぞれのサイズと範囲は、環境によって異なる場合がありますが、一般的な情報を以下に示します。

データ型サイズ (バイト)最小値 (近似)最大値 (近似)
float41.175494e-383.402823e+38
double82.2250738585072014e-3081.7976931348623157e+308
long double8 (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環境における主要なデータ型の具体例を示します。

データ型サイズ (バイト)最小値最大値
char1-128127
unsigned char10255
short2-32,76832,767
unsigned short2065,535
int4-2,147,483,6482,147,483,647
unsigned int404,294,967,295
long4-2,147,483,6482,147,483,647
unsigned long404,294,967,295
long long8-9,223,372,036,854,775,8089,223,372,036,854,775,807
unsigned long long8018,446,744,073,709,551,615
32bit環境でもlong longが8バイトの理由

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環境における主要なデータ型の具体例を示します。

データ型サイズ (バイト)最小値最大値
char1-128127
unsigned char10255
short2-32,76832,767
unsigned short2065,535
int4-2,147,483,6482,147,483,647
unsigned int404,294,967,295
long8-9,223,372,036,854,775,8089,223,372,036,854,775,807
unsigned long8018,446,744,073,709,551,615
long long8-9,223,372,036,854,775,8089,223,372,036,854,775,807
unsigned long long8018,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環境では各データ型のサイズと範囲が異なり、特に大きな数を扱う際にはlonglong 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環境での具体例を通じて詳しく解説しました。

また、整数型や浮動小数点型の特徴、データ型のサイズを確認する方法についても触れました。

これらの情報を活用することで、プログラムの設計や実装においてより適切なデータ型を選択し、効率的なメモリ使用や計算精度の向上を図ることが可能です。

今後は、実際のプログラミングにおいてこれらの知識を活かし、データ型の選択に自信を持って取り組んでみてください。

関連記事

Back to top button