Loose-Info.com
Last Update 2023/09/19
TOP - 各種テスト - C++ - 型

概要

整数型
文字型
ワイド文字型
bool型
符号付き整数型
符号なし整数型
浮動小数点型
void型
戻り値がvoid型である関数の呼び出し(エラー例)
voidポインタへの代入および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つのポインタ型間のキャストが無効であることに関するエラーが発生
$ 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


コード例・出力内容中の表記

・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。