11---
22chapter : 1
33cpp_standard :
4- - 11
4+ - 11
55description : 掌握 C 语言的浮点类型与精度问题、字符存储与编码、const 限定符和隐式类型转换规则,理解 C++ 类型安全设计的动机
66difficulty : beginner
77order : 3
88platform : host
99prerequisites :
10- - 数据类型基础:整数与内存
10+ - 数据类型基础:整数与内存
1111reading_time_minutes : 12
1212tags :
13- - host
14- - cpp-modern
15- - beginner
16- - 入门
17- - 基础
13+ - host
14+ - cpp-modern
15+ - beginner
16+ - 入门
17+ - 基础
1818title : 浮点、字符、const 与类型转换
1919---
20-
2120# 浮点、字符、const 与类型转换
2221
2322上一篇里我们把整数家族从里到外拆了一遍——整型层级、有符号无符号、固定宽度类型和 sizeof。但程序世界里不只有整数:商品价格需要小数,屏幕上的文字需要字符,变量声明后有时候需要保护它不被乱改,不同类型的数据混在一起运算时编译器到底怎么处理。这些就是我们今天要一块一块啃的内容。
@@ -36,7 +35,7 @@ title: 浮点、字符、const 与类型转换
3635
3736我们接下来的所有实验都在这个环境下进行:
3837
39- - 平台:Linux x86_64 (WSL2 也可以)
38+ - 平台:Linux x86 \_ 64 (WSL2 也可以)
4039- 编译器:GCC 13+ 或 Clang 17+
4140- 编译选项:` -Wall -Wextra -std=c17 `
4241
@@ -46,11 +45,11 @@ title: 浮点、字符、const 与类型转换
4645
4746C 语言提供了三种浮点类型,按精度从小到大排列:
4847
49- | 类型 | 典型位数 | 有效数字 | 字面量写法 |
50- | ------------- | --------------- | -------- | -------------- |
51- | ` float ` | 32 位(单精度) | 约 7 位 | ` 3.14f ` |
52- | ` double ` | 64 位(双精度) | 约 15 位 | ` 3.14 ` (默认) |
53- | ` long double ` | 80 或 128 位 | 平台相关 | ` 3.14L ` |
48+ | 类型 | 典型位数 | 有效数字 | 字面量写法 |
49+ | ------| ---------| --------- | -----------|
50+ | ` float ` | 32 位(单精度) | 约 7 位 | ` 3.14f ` |
51+ | ` double ` | 64 位(双精度) | 约 15 位 | ` 3.14 ` (默认) |
52+ | ` long double ` | 80 或 128 位 | 平台相关 | ` 3.14L ` |
5453
5554` double ` 是默认的浮点类型——你写 ` 3.14 ` 的时候,编译器就把它当作 ` double ` 处理。如果要用 ` float ` ,记得加 ` f ` 后缀;要用 ` long double ` ,加 ` L ` 后缀。
5655
@@ -68,8 +67,8 @@ long double ld = 3.14L; // 后缀 L 表示 long double
6867
6968十进制科学计数法把 ` 0.0123 ` 写成 ` 1.23 × 10⁻² ` ,一个尾数乘以 10 的幂。计算机干的事一样,只是底换成 2:` 小数 = (±1) × 尾数 × 2^指数 ` 。` float ` 的 32 个位就照这三块切:
7069
71- | 1 位符号 | 8 位指数 | 23 位尾数 |
72- | -------- | ---------------------------- | ---------------------------- |
70+ | 1 位符号 | 8 位指数 | 23 位尾数 |
71+ | ---| ---| ---|
7372| 正还是负 | 决定能表示多大、多小(范围) | 决定有多少位有效数字(精度) |
7473
7574指数位管量级,尾数位管精细度,两个都有限。指数让你能写到 ` 10³⁸ ` 那么大、也能小到 ` 10⁻⁴⁵ ` ;可尾数只有 23 位,有效数字大概就 7 位十进制,再多存不下。
@@ -340,9 +339,6 @@ int main(void)
340339}
341340```
342341
343- ### 练习 1 参考答案
344-
345-
346342```text
347343a_double + b_double == c_double? no
348344a_float + b_float == c_float? yes
@@ -394,6 +390,7 @@ if (target < sizeof(values) / sizeof(values[0])) {
394390
395391提示:` sizeof ` 返回的是什么类型?
396392
393+
397394### 练习 2 参考答案
398395
399396``` c
0 commit comments