Last Update 2023/09/19
概要
整数型
void型
文字型
sample.cpp
#include <iostream>
#include <limits>
int main()
{
std::cout << "各種文字型および範囲(出力は実装依存値)" << std::endl;
constexpr char char_max = std::numeric_limits<char>::max();
constexpr char char_min = std::numeric_limits<char>::min();
std::cout << "char" << std::endl;
std::cout << " max = " << static_cast<int>(char_max) << std::endl;
std::cout << " min = " << static_cast<int>(char_min) << std::endl;
std::cout << " sizeof(char) = " << sizeof(char) << std::endl;
std::cout << std::endl;
constexpr signed char signed_char_max
= std::numeric_limits<signed char>::max();
constexpr signed char signed_char_min
= std::numeric_limits<signed char>::min();
std::cout << "signed char" << std::endl;
std::cout << " max = " << static_cast<int>(signed_char_max) << std::endl;
std::cout << " min = " << static_cast<int>(signed_char_min) << std::endl;
std::cout << " sizeof(signed char) = " << sizeof(signed char) << std::endl;
std::cout << std::endl;
constexpr unsigned char unsigned_char_max
= std::numeric_limits<unsigned char>::max();
constexpr unsigned char unsigned_char_min
= std::numeric_limits<unsigned char>::min();
std::cout << "unsigned char" << std::endl;
std::cout << " max = " << static_cast<int>(unsigned_char_max) << std::endl;
std::cout << " min = " << static_cast<int>(unsigned_char_min) << std::endl;
std::cout << " sizeof(unsigned char) = " << sizeof(unsigned char) << std::endl;
}
実行結果
$ gcc -Wall sample.cpp -lstdc++
$ ./a.out
各種文字型および範囲(出力は実装依存値)
char
max = 127
min = -128
sizeof(char) = 1
signed char
max = 127
min = -128
sizeof(signed char) = 1
unsigned char
max = 255
min = 0
sizeof(unsigned char) = 1
ワイド文字型
sample.cpp
#include <iostream>
#include <limits>
int main()
{
std::cout << "各種ワイド文字型および範囲(出力は実装依存値)" << std::endl;
constexpr wchar_t wchar_t_max = std::numeric_limits<wchar_t>::max();
constexpr wchar_t wchar_t_min = std::numeric_limits<wchar_t>::min();
std::cout << "wchar_t" << std::endl;
std::cout << " max = " << wchar_t_max << std::endl;
std::cout << " min = " << wchar_t_min << std::endl;
std::cout << " sizeof(wchar_t) = " << sizeof(wchar_t) << std::endl;
std::cout << std::endl;
constexpr char16_t char16_t_max = std::numeric_limits<char16_t>::max();
constexpr char16_t char16_t_min = std::numeric_limits<char16_t>::min();
std::cout << "char16_t" << std::endl;
std::cout << " max = " << char16_t_max << std::endl;
std::cout << " min = " << char16_t_min << std::endl;
std::cout << " sizeof(char16_t) = " << sizeof(char16_t) << std::endl;
std::cout << std::endl;
constexpr char32_t char32_t_max = std::numeric_limits<char32_t>::max();
constexpr char32_t char32_t_min = std::numeric_limits<char32_t>::min();
std::cout << "char32_t" << std::endl;
std::cout << " max = " << char32_t_max << std::endl;
std::cout << " min = " << char32_t_min << std::endl;
std::cout << " sizeof(char32_t) = " << sizeof(char32_t) << std::endl;
std::cout << std::endl;
}
実行結果
$ gcc -Wall sample.cpp -lstdc++
$ ./a.out
各種ワイド文字型および範囲(出力は実装依存値)
wchar_t
max = 2147483647
min = -2147483648
sizeof(wchar_t) = 4
char16_t
max = 65535
min = 0
sizeof(char16_t) = 2
char32_t
max = 4294967295
min = 0
sizeof(char32_t) = 4
bool型
sample.cpp
#include <iostream>
#include <limits>
int main()
{
std::cout << "bool型代入・出力例" << std::endl;
bool b1 = true;
bool b2 = false;
bool b3 = 1;
bool b4 = 0;
std::cout << "bool" << std::endl;
std::cout << " b1(true) = " << b1 << std::endl;
std::cout << " b2(false) = " << b2 << std::endl;
std::cout << " b3(1) = " << b3 << std::endl;
std::cout << " b4(0) = " << b4 << std::endl;
std::cout << " sizeof(bool) = " << sizeof(bool) << std::endl;
std::cout << std::endl;
}
実行結果
$ gcc -Wall sample.cpp -lstdc++
$ ./a.out
bool型代入・出力例
bool
b1(true) = 1
b2(false) = 0
b3(1) = 1
b4(0) = 0
sizeof(bool) = 1
符号付き整数型
sample.cpp
#include <iostream>
#include <limits>
int main()
{
std::cout << "各種符号付き整数型および範囲(出力は実装依存値)" << std::endl;
constexpr signed char signed_char_max = std::numeric_limits<signed char>::max();
constexpr signed char signed_char_min = std::numeric_limits<signed char>::min();
std::cout << "signed char" << std::endl;
std::cout << " max = " << static_cast<int>(signed_char_max) << std::endl;
std::cout << " min = " << static_cast<int>(signed_char_min) << std::endl;
std::cout << " sizeof(signed char) = " << sizeof(signed char) << std::endl;
std::cout << std::endl;
constexpr short int short_int_max = std::numeric_limits<short int>::max();
constexpr short int short_int_min = std::numeric_limits<short int>::min();
std::cout << "short int" << std::endl;
std::cout << " max = " << short_int_max << std::endl;
std::cout << " min = " << short_int_min << std::endl;
std::cout << " sizeof(short int) = " << sizeof(short int) << std::endl;
std::cout << std::endl;
constexpr int int_max = std::numeric_limits<int>::max();
constexpr int int_min = std::numeric_limits<int>::min();
std::cout << "int" << std::endl;
std::cout << " max = " << int_max << std::endl;
std::cout << " min = " << int_min << std::endl;
std::cout << " sizeof(int) = " << sizeof(int) << std::endl;
std::cout << std::endl;
constexpr long int long_int_max = std::numeric_limits<long int>::max();
constexpr long int long_int_min = std::numeric_limits<long int>::min();
std::cout << "long int" << std::endl;
std::cout << " max = " << long_int_max << std::endl;
std::cout << " min = " << long_int_min << std::endl;
std::cout << " sizeof(long int) = " << sizeof(long int) << std::endl;
std::cout << std::endl;
constexpr long long int long_long_int_max = std::numeric_limits<long long int>::max();
constexpr long long int long_long_int_min = std::numeric_limits<long long int>::min();
std::cout << "long long int" << std::endl;
std::cout << " max = " << long_long_int_max << std::endl;
std::cout << " min = " << long_long_int_min << std::endl;
std::cout << " sizeof(long long int) = " << sizeof(long long int) << std::endl;
std::cout << std::endl;
}
実行結果
$ gcc -Wall sample.cpp -lstdc++
$ ./a.out
各種符号付き整数型および範囲(出力は実装依存値)
signed char
max = 127
min = -128
sizeof(signed char) = 1
short int
max = 32767
min = -32768
sizeof(short int) = 2
int
max = 2147483647
min = -2147483648
sizeof(int) = 4
long int
max = 9223372036854775807
min = -9223372036854775808
sizeof(long int) = 8
long long int
max = 9223372036854775807
min = -9223372036854775808
sizeof(long long int) = 8
符号なし整数型
sample.cpp
#include <iostream>
#include <limits>
int main()
{
std::cout << "各種符号なし整数型および範囲(出力は実装依存値)" << std::endl;
constexpr unsigned char unsigned_char_max = std::numeric_limits<unsigned char>::max();
constexpr unsigned char unsigned_char_min = std::numeric_limits<unsigned char>::min();
std::cout << "unsigned char" << std::endl;
std::cout << " max = " << static_cast<int>(unsigned_char_max) << std::endl;
std::cout << " min = " << static_cast<int>(unsigned_char_min) << std::endl;
std::cout << " sizeof(unsigned char) = " << sizeof(unsigned char) << std::endl;
std::cout << std::endl;
constexpr unsigned short int unsigned_short_int_max = std::numeric_limits<unsigned short int>::max();
constexpr unsigned short int unsigned_short_int_min = std::numeric_limits<unsigned short int>::min();
std::cout << "unsigned short int" << std::endl;
std::cout << " max = " << unsigned_short_int_max << std::endl;
std::cout << " min = " << unsigned_short_int_min << std::endl;
std::cout << " sizeof(unsigned short int) = " << sizeof(unsigned short int) << std::endl;
std::cout << std::endl;
constexpr unsigned int unsigned_int_max = std::numeric_limits<unsigned int>::max();
constexpr unsigned int unsigned_int_min = std::numeric_limits<unsigned int>::min();
std::cout << "unsigned int" << std::endl;
std::cout << " max = " << unsigned_int_max << std::endl;
std::cout << " min = " << unsigned_int_min << std::endl;
std::cout << " sizeof(unsigned int) = " << sizeof(unsigned int) << std::endl;
std::cout << std::endl;
constexpr unsigned long int unsigned_long_int_max = std::numeric_limits<unsigned long int>::max();
constexpr unsigned long int unsigned_long_int_min = std::numeric_limits<unsigned long int>::min();
std::cout << "unsigned long int" << std::endl;
std::cout << " max = " << unsigned_long_int_max << std::endl;
std::cout << " min = " << unsigned_long_int_min << std::endl;
std::cout << " sizeof(unsigned long int) = " << sizeof(unsigned long int) << std::endl;
std::cout << std::endl;
constexpr unsigned long long int unsigned_long_long_int_max = std::numeric_limits<unsigned long long int>::max();
constexpr unsigned long long int unsigned_long_long_int_min = std::numeric_limits<unsigned long long int>::min();
std::cout << "unsigned long long int" << std::endl;
std::cout << " max = " << unsigned_long_long_int_max << std::endl;
std::cout << " min = " << unsigned_long_long_int_min << std::endl;
std::cout << " sizeof(unsigned long long int) = " << sizeof(unsigned long long int) << std::endl;
std::cout << std::endl;
}
実行結果
$ gcc -Wall sample.cpp -lstdc++
$ ./a.out
各種符号なし整数型および範囲(出力は実装依存値)
unsigned char
max = 255
min = 0
sizeof(unsigned char) = 1
unsigned short int
max = 65535
min = 0
sizeof(unsigned short int) = 2
unsigned int
max = 4294967295
min = 0
sizeof(unsigned int) = 4
unsigned long int
max = 18446744073709551615
min = 0
sizeof(unsigned long int) = 8
unsigned long long int
max = 18446744073709551615
min = 0
sizeof(unsigned long long int) = 8
浮動小数点型
sample.cpp
#include <iostream>
#include <limits>
int main()
{
std::cout << "各種浮動小数点型および範囲(出力は実装依存値)" << std::endl;
std::cout << std::endl;
constexpr float float_max = std::numeric_limits<float>::max();
constexpr float float_min = std::numeric_limits<float>::min();
std::cout << "float" << std::endl;
std::cout << " max = " << float_max << std::endl;
std::cout << " min = " << float_min << std::endl;
std::cout << " sizeof(float) = " << sizeof(float) << std::endl;
std::cout << std::endl;
constexpr double double_max = std::numeric_limits<double>::max();
constexpr double double_min = std::numeric_limits<double>::min();
std::cout << "double" << std::endl;
std::cout << " max = " << double_max << std::endl;
std::cout << " min = " << double_min << std::endl;
std::cout << " sizeof(double) = " << sizeof(double) << std::endl;
std::cout << std::endl;
constexpr long double long_double_max = std::numeric_limits<long double>::max();
constexpr long double long_double_min = std::numeric_limits<long double>::min();
std::cout << "long double" << std::endl;
std::cout << " max = " << long_double_max << std::endl;
std::cout << " min = " << long_double_min << std::endl;
std::cout << " sizeof(long double) = " << sizeof(long double) << std::endl;
std::cout << std::endl;
}
実行結果
$ gcc -Wall sample.cpp -lstdc++
$ ./a.out
各種浮動小数点型および範囲(出力は実装依存値)
float
max = 3.40282e+38
min = 1.17549e-38
sizeof(float) = 4
double
max = 1.79769e+308
min = 2.22507e-308
sizeof(double) = 8
long double
max = 1.18973e+4932
min = 3.3621e-4932
sizeof(long double) = 16
void型
戻り値がvoid型である関数の呼び出し(エラー例)
sample.cpp
#include <iostream>
// 戻り値がvoid型の関数
void sampfunc1()
{
printf("sampfunc1\n");
}
int sampfunc2()
{
printf("sampfunc2\n");
return 2;
}
int main()
{
// 引数を伴い戻り値を利用する関数の呼び出し
int i1 = sampfunc1();
int i2 = sampfunc2();
std::cout << "sampfunc1 = " << i1 << std::endl;
std::cout << "sampfunc2 = " << i2 << std::endl;
}
実行結果
$ gcc -Wall sample.cpp -lstdc++ <--- サンプルコードをコンパイル
sample.cpp: In function ‘int main()’:
sample.cpp:19:27: error: void value not ignored as it ought to be <--- void値に関するエラー
19 | int i1 = sampfunc1();
| ~~~~~~~~~^~
void型
voidポインタへの代入およびvoidポインタからの変換(エラー例含む)
sample1.cpp
参考例
明示的にキャストせずに相互変換できない異なる型のポインタを代入するコード
参考例
明示的にキャストせずに相互変換できない異なる型のポインタを代入するコード
#include <iostream>
int main()
{
unsigned int uint = 0x10FFFF10;
unsigned int *p_uint = &uint;
// unsigned charへのポインタに変換
unsigned char *p_uc = p_uint;
std::cout << std::uppercase << std::hex;
std::cout << *p_uint << std::endl;
std::cout << static_cast<int>(*p_uc) << std::endl;
}
実行結果
初期化時に異なるポインタを変換できないことに関するエラーが発生
初期化時に異なるポインタを変換できないことに関するエラーが発生
$ gcc -Wall sample1.cpp -lstdc++
sample1.cpp: In function ‘int main()’:
sample1.cpp:10:31: error: cannot convert ‘unsigned int*’ to ‘unsigned char*’ in initialization
10 | unsigned char *p_uc = p_uint;
| ^~~~~~
| |
| unsigned int*
sample2.cpp
参考例
明示的にキャストして相互変換できない異なる型のポインタを代入するコード
参考例
明示的にキャストして相互変換できない異なる型のポインタを代入するコード
#include <iostream>
int main()
{
unsigned int uint = 0x10FFFF10;
unsigned int *p_uint = &uint;
// 明示的にキャストしてunsigned charへのポインタに変換
unsigned char *p_uc = static_cast<unsigned char *>(p_uint);
std::cout << std::uppercase << std::hex;
std::cout << *p_uint << std::endl;
std::cout << static_cast<int>(*p_uc) << std::endl;
}
実行結果
2つのポインタ型間のキャストが無効であることに関するエラーが発生
2つのポインタ型間のキャストが無効であることに関するエラーが発生
$ gcc -Wall sample2.cpp -lstdc++
sample2.cpp: In function ‘int main()’:
sample2.cpp:10:31: error: invalid ‘static_cast’ from type ‘unsigned int*’ to type ‘unsigned char*’
10 | unsigned char *p_uc = static_cast<unsigned char *>(p_uint);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sample3.cpp
#include <iostream>
int main()
{
unsigned int uint = 0x10FFFF10;
unsigned int *p_uint = &uint;
// voidへのポインタに変換
void *p_void = p_uint;
// unsigned charへのポインタに変換
unsigned char *p_uc = static_cast<unsigned char *>(p_void);
std::cout << std::uppercase << std::hex;
std::cout << *p_uint << std::endl;
std::cout << static_cast<int>(*p_uc) << std::endl;
}
実行結果
(このコードでのエラーの発生は無いが、異なる型のポインタへ変換されたポインタの使用は不正な動作を生じる危険性があるため要注意)
(このコードでのエラーの発生は無いが、異なる型のポインタへ変換されたポインタの使用は不正な動作を生じる危険性があるため要注意)
$ gcc -Wall sample3.cpp -lstdc++
$ ./a.out
10FFFF10
10
実行環境
GNU bash, version 5.1.16
GCC-12.2.0
GNU C Library 2.36
GNU Binutils 2.39
GCC-12.2.0
GNU C Library 2.36
GNU Binutils 2.39
コード例・出力内容中の表記
・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。