🔷 第二章 C++语言基础
📄 一句话概括

整型常量就是不带小数点的整数,同一个数有四种写法:十进制 255、八进制 0377(0 开头)、十六进制 0xFF(0x 开头)、二进制 0b11111111(0b 开头,C++14 起)。想指定"更大/不带负号"的类型,就在后面加后缀:U(无符号)、L(长整型)、10U、900LL。最容易踩的坑:010 不是十,是八!

一、四种进制写法对照

进制 写法 例子 读法 什么时候用
十进制 直接写 255 二百五十五 日常计算
八进制 0 开头 0377 八进制的 377 老代码、文件权限(Linux 的 755)
十六进制 0x 或 0X 0xFF 十六进制的 FF 看内存/颜色/地址最常用
二进制 0b 或 0B 0b11111111 二进制 C++14 后才有;直观看"每一位"

同一个数,四种写法,值完全相等:

255(十)= 0377(八)= 0xFF(十六)= 0b11111111(二)

为什么要有十六进制:一个十六进制位正好对应 4 个二进制位(8 = 1000,F = 1111),所以 0xFF 一眼就能看出"低 8 位全是 1"。做底层、看内存、调颜色(#FF8800)时,它比十进制好用得多。

二、后缀:告诉编译器"我要哪种整型"

同样是个 10,加个后缀,类型就变了:

后缀 类型 含义 例子
(不加) int 默认 10
U / u unsigned int 无符号(只能非负,正数范围翻倍) 10U
L / l long 长整型 100000L
UL unsigned long 无符号长整型 30UL
LL long long 超长整型(64 位起步) 9000000000LL

两条实用规则:

  1. 后缀建议写大写(L 而不是 l)——小写 l 跟数字 1 长得太像,容易看错
  2. 不加后缀时编译器会自动挑:先试 int,装不下就自动升级成 long、long long。所以日常写 100 完全够用,后缀是"我要精确控制"时才用

三、动手 Demo:把"前导零陷阱"亲手踩一次

新建 intconst.cpp:

#include <iostream>
using namespace std;

int main() {
    cout << "10   = " << 10   << endl;
    cout << "010  = " << 010  << endl;    // 八进制!
    cout << "0x10 = " << 0x10 << endl;    // 十六进制
    cout << "0b10 = " << 0b10 << endl;    // 二进制
    return 0;
}

看到什么算成功(也是本节最重要的一眼):

10   = 10
010  = 8      ← 不是 10!
0x10 = 16
0b10 = 2

结论:数字前面多写一个 0,值就变了。 以后写"对齐用的数字"(比如日期 09、编号 007)时,千万别带前导零。

30 秒实验:把 cout << 0xFF << endl; 加上,看它输出 255。再试试 cout << hex << 255 << endl;——输出会变成 ff(cout 也能按十六进制打印,2.5.3 细讲)。

四、常见误区

  1. "010 就是十"——错,是八。前导零在 C++ 里是"这是八进制"的标记。这是新手最经典的坑之一
  2. "0x 和 0X 不一样"——一样。字母大小写都行,0xFF 和 0Xff 完全相同(十六进制里的字母 a~f 也不区分大小写)
  3. "整数写多大都行"——不行。每种类型有范围上限,超了会溢出(2.3.3 讲整型变量时会细说)。写大数记得加 L 或 LL
  4. "10 和 10U 差不多"——大多数时候结果一样,但当它跟负数一起运算时会出岔子:无符号与有符号混算,负数会被"解释"成一个巨大的正数(这是真实的踩坑现场,第 3 章讲运算时提)
自测三问(点开对答案) 1. `255` 的八进制、十六进制、二进制写法分别是什么?——`0377`、`0xFF`、`0b11111111`。 2. `010` 的值是多少?为什么?——**8**。因为**前导 0 表示八进制**,八进制里的 10 就是十进制 8。 3. `10U`、`100L`、`900LL` 里的后缀分别什么意思?——`U` 无符号整型、`L` 长整型、`LL` 超长整型;后缀用来**明确指定类型**。

相关笔记