データ型

基本型 (fundamental types)

  • ユーザー定義型 (user-defined types)
  • 組み込みデータ型 (built-in types)
    • ユーザー定義型 以外の型

論理型

0または0.0はfalseに、それ以外はtrueに変換されます。

bool a = 0; // false
bool b = 1; // true
bool c = 2; // true

bool d = 0.0;  // false
bool e = 1.0;  // true
bool f = -0.1; // true

値0のポインタはfalse、それ以外はtrueに変換されます。

int* p1 = NULL;
int z;
int* p2 = &z;

bool bp1 = p1; // false
bool bp2 = p2; // true

falseは0に、trueは1の整数に変換されます。また演算は整数に変換された上で実行され、その結果が0ならばfalseとなります。

int x = false; // 0
int y = true;  // 1

bool e1 = true - true; // false (1-1=0)
bool e2 = true + true; // true  (1+1=2)

論理値がTRUE、FALSEのように大文字で記述されることがありますが、これはWindows.hなどで

#define TRUE 1
#define FALSE 0

のように定義されているためで、これらは整数値です。windows.h - c++ - What is the difference between false and FALSE? - Stack Overflow

参考

参考書

文字型

char ch = 'a';

文字列の処理は、C ランタイム ライブラリもしくは標準ライブラリのstringコンテナを用いると簡単です。

文字リテラル (Character literal)

文字リテラルとは'a'のようにシングルクォートで囲まれた文字で、文字定数とも呼ばれます。

種類 表記
文字リテラル char 'a'
char (UTF-8) u8'a'
ワイド文字リテラル wchar_t L'a'
char16_t (UTF-16) u'a'
char32_t (UTF-32) U'a'
Character literals - String and Character Literals (C++) | MSDN

ファイルに出力し、バイナリエディタで確認してみます。

std::ofstream stream("sample.txt");

// U+3042「あ」
stream <<   "\u3042"; // 82 A0    … Shift_JISによる符号化
stream << u8"\u3042"; // E3 81 82 … UTF-8による符号化

// U+1F607「😇」
stream <<   "\U0001F607"; // 3F 3F       … ?
stream << u8"\U0001F607"; // F0 9F 98 87 … UTF-8による符号化

stream.close();

ところで文字列リテラルはダブルクォートで囲んで表現し、配列に格納されます。

エスケープ

char ch1 = '\\'; // \
char ch2 = '\''; // '
char ch3 = '\"'; // "
char ch4 = '"';  // " (エスケープしなくても良い)

参考

参考書

  • プログラミング言語C++ 第3版 [アジソン・ウェスレイ・パブリッシャーズ・ジャパン] Bjarne Stroustrup
    20章「文字列」付録C.3「キャラクタセット」

整数型 (Integer)

別名
int signed
short short int、signed short int
long long int、signed long int
int a = 3;
a /= 2;      // 1

int b = 1.5; // 1

64ビット環境

コンパイラの設定によってビット長が異なります。

データモデル ビット長 採用している環境
char short int long long long ポインタ
ILP32 8 16 32 32 64 32  
LLP64 (IL32P64 / P64) 8 16 32 32 64 64 Windows系
LP64 (I32LP64) 8 16 32 64 64 64 UNIX系
ILP64 8 16 64 64 64 64 UNIX系

符号なし整数

bool以外の整数系データ型は、unsignedを付けることで符号なし整数として表現できます。

signed unsigned
char -128 ~ 127 0 ~ 255
short -32,768 ~ 32,767 0 ~ 65,535
int -2,147,483,648 ~ 2,147,483,647 ※1 0 ~ 4,294,967,295 ※1
long
データ型の範囲 | MSDN ※1 32ビットの場合
unsigned int a = 1;  // 1 (0x00000001)
unsigned int b = -1; // 4294967295 (0xffffffff)

unsigned int c = 1;
c -= 3; // 4294967294 (0xfffffffe)
  signed char a1 = -1;
unsigned char a2 = a1; // 255

unsigned char b1 = 128;
  signed char b2 = b1; // -128

整数リテラル

接尾辞 (サフィックス)
unsigned u または U
long l または L
unsigned long ul
__int64 ll、LL または i64
2進、8進、10進、16進の対応
2進 ※1 0b0 0b10 0b10000
8進 00 02 20
10進 0 2 16
16進 0x0 0x2 0x10
C++ 整数定数 | MSDN

※1 Visual C++では、Visual C++ 2015以降で2進数リテラルに対応しています。ISO C/C++ 標準のサポート - Visual Studio 2015 における Visual C++ の新機能 | MSDN

非数 (NAN)

  文字列
簡易なNaN (Quiet NaN) nan
Signaling NaN nan(snan)
不定のNaN (Indefinite NaN) nan(ind)
無限大 (Infinity) inf
Visual C++ change history 2003 - 20151 | MSDN
double ind = std::pow(-1.0, 0.5);
std::cout << ind; // -nan(ind)

double zero = 0;
double inf = 1 / zero;
std::cout << inf; // inf

bool r1 = isnan(ind);  // true
bool r2 = isnan(zero); // false
bool r3 = isnan(inf);  // false
double r = sqrt(-2.0); // -nan(ind)

浮動小数点数型 (Floating-Point)

浮動小数点数リテラル (Floating-Point Constants)

接尾辞 (サフィックス)
float f または F
long double l または L

C++ 浮動小数点定数 | MSDN

型キャスト (type cast)

キャスト演算子 用途 安全性
static_cast 関連のある型への変換
static_cast 演算子 | MSDN
reinterpret_cast 関連のない型への変換。任意の整数型からポインタへ、ポインタから他のポインタへの変換
reinterpret_cast 演算子 | MSDN
×
const_cast const属性やvalatile属性の除去
const_cast 演算子 | MSDN
dynamic_cast 安全なダウンキャスト。キャストの成否の確認
dynamic_cast 演算子 | MSDN
() Cスタイルのキャスト。static_cast、reinterpret_cast、const_castを兼ねる
キャスト演算子: () | MSDN
×
int a;
void* p1 = static_cast<void*>(&a);
void* p2 = static_cast<void*>(a); // C2440 'static_cast': 'int' から 'void *' に変換できません。

void* p3 = reinterpret_cast<void*>(a);
int a = 10;
const int* p1 = &a;
*p1 = 20; // C3892 const である変数へは割り当てることはできません

int* p2 = p1; // C2440 '初期化中': 'const int *' から 'int *' に変換できません。
int* p3 = const_cast<int*>(p1);
*p3 = 20;

配列の型キャスト

参考

参考書

参考

参考書

Microsoft Learnから検索