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