C++ 数据类型:int、double、char、bool

一句话:类型告诉编译器一个值占几个字节、这些字节怎么解释。初学者天天打交道的四个:int(整数)、double(小数)、char(一个字符 — 其实是个小整数)、bool(真/假,打印成 1/0)。

四种类型同台

#include <iostream>
using namespace std;

int main() {
    int    age   = 25;     // 整数
    double price = 9.99;   // 小数
    char   grade = 'A';    // 一个字符,单引号
    bool   ok    = true;   // 真或假

    cout << age << " " << price << " " << grade << " " << ok << endl;
    return 0;
}

两处要看:grade 用单引号('A',不是 "A" — 那是字符串,混用是经典编译错误);ok 打出来是 1 不是 true — cout 默认把 bool 显示为数字,想要 true/false 得写 boolalpha。

四段速览

类型存什么典型大小要小心
int整数4 字节超 ±21 亿溢出;7/2 等于 3
double小数8 字节0.1 + 0.2 不严格等于 0.3(浮点误差)
char一个字符1 字节'a' vs "a";它暗地里是数字
bool真 / 假1 字节打印成 1/0;任何非零数转 bool 都是真

大小写的是"典型值":C++ 标准只定下限不定精确值 — 桌面编译器上 sizeof(int) 会告诉你你这台机器的真实答案。

char 是穿了戏服的数字

每个字符都以整数编码(ASCII)存储:'A' 是 65,'a' 是 97,'0' 是 48。所以字符能做算术:

#include <iostream>
using namespace std;

int main() {
    char c = 'A';
    cout << c << " is code " << (int)c << endl;
    cout << "next letter: " << (char)(c + 1) << endl;
    cout << "digit '7' as number: " << '7' - '0' << endl;
    return 0;
}

最后一行 — '7' - '0' — 是货真价实的面试级惯用法:把数字字符转成数值。'7' 的编码是 55,'0' 是 48,一减恰好剩 7 — 对每个数字字符都成立,不需要查表。

各自怎么翻车

int 还是 double — 新手的决策树

  1. 值可能带小数吗?(平均、价格、百分比)→ double。
  2. 是计数、下标、年份、分数?→ int。
  3. 要超过 ±21 亿?→ 桌面编译器上用 long long(练习场覆盖教学核心,见编译器安装指南)。
  4. 钱?→ 整数存分。认真的。

类型相关面试题

  1. "cout 打印 bool 输出什么?" — 1 或 0;cout << boolalpha 切换成 true/false。
  2. "为什么 7 / 2 等于 3?" — 两边是 int,做的是整数除法(完整指南在这)。
  3. "'A' 和 "A" 差在哪?" — 一个 char(一字节,编码 65)vs 一个字符串(以 '\0' 结尾的数组)。
  4. "int 溢出会怎样?" — 有符号溢出是未定义行为:没有异常,没有可靠的回绕;编译器可以假设它从不发生。
  5. "字符算术有什么用?" — 数字转换('7' - '0')、大小写转换(c - 'a' + 'A'),一切文本处理的底层原理。

练习

相关:整数除法、传值、指针与引用、15 道初学者面试题。