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+
2021# 浮点、字符、const 与类型转换
2122
2223上一篇里我们把整数家族从里到外拆了一遍——整型层级、有符号无符号、固定宽度类型和 sizeof。但程序世界里不只有整数:商品价格需要小数,屏幕上的文字需要字符,变量声明后有时候需要保护它不被乱改,不同类型的数据混在一起运算时编译器到底怎么处理。这些就是我们今天要一块一块啃的内容。
@@ -35,7 +36,7 @@ title: 浮点、字符、const 与类型转换
3536
3637我们接下来的所有实验都在这个环境下进行:
3738
38- - 平台:Linux x86 \_ 64 (WSL2 也可以)
39+ - 平台:Linux x86_64 (WSL2 也可以)
3940- 编译器:GCC 13+ 或 Clang 17+
4041- 编译选项:` -Wall -Wextra -std=c17 `
4142
@@ -45,11 +46,11 @@ title: 浮点、字符、const 与类型转换
4546
4647C 语言提供了三种浮点类型,按精度从小到大排列:
4748
48- | 类型 | 典型位数 | 有效数字 | 字面量写法 |
49- | ------| ---------| ---------| -----------|
50- | ` float ` | 32 位(单精度) | 约 7 位 | ` 3.14f ` |
51- | ` double ` | 64 位(双精度) | 约 15 位 | ` 3.14 ` (默认) |
52- | ` long double ` | 80 或 128 位 | 平台相关 | ` 3.14L ` |
49+ | 类型 | 典型位数 | 有效数字 | 字面量写法 |
50+ | ------------- | --------------- | -------- | -------------- |
51+ | ` float ` | 32 位(单精度) | 约 7 位 | ` 3.14f ` |
52+ | ` double ` | 64 位(双精度) | 约 15 位 | ` 3.14 ` (默认) |
53+ | ` long double ` | 80 或 128 位 | 平台相关 | ` 3.14L ` |
5354
5455` double ` 是默认的浮点类型——你写 ` 3.14 ` 的时候,编译器就把它当作 ` double ` 处理。如果要用 ` float ` ,记得加 ` f ` 后缀;要用 ` long double ` ,加 ` L ` 后缀。
5556
@@ -67,8 +68,8 @@ long double ld = 3.14L; // 后缀 L 表示 long double
6768
6869十进制科学计数法把 ` 0.0123 ` 写成 ` 1.23 × 10⁻² ` ,一个尾数乘以 10 的幂。计算机干的事一样,只是底换成 2:` 小数 = (±1) × 尾数 × 2^指数 ` 。` float ` 的 32 个位就照这三块切:
6970
70- | 1 位符号 | 8 位指数 | 23 位尾数 |
71- | ---| ---| ---|
71+ | 1 位符号 | 8 位指数 | 23 位尾数 |
72+ | -------- | ---------------------------- | ---------------------------- |
7273| 正还是负 | 决定能表示多大、多小(范围) | 决定有多少位有效数字(精度) |
7374
7475指数位管量级,尾数位管精细度,两个都有限。指数让你能写到 ` 10³⁸ ` 那么大、也能小到 ` 10⁻⁴⁵ ` ;可尾数只有 23 位,有效数字大概就 7 位十进制,再多存不下。
@@ -339,6 +340,8 @@ int main(void)
339340}
340341```
341342
343+ ### 练习 1 参考答案
344+
342345```text
343346a_double + b_double == c_double? no
344347a_float + b_float == c_float? yes
@@ -369,7 +372,6 @@ if (target < sizeof(values) / sizeof(values[0])) {
369372
370373提示:` sizeof ` 返回的是什么类型?
371374
372-
373375### 练习 2 参考答案
374376
375377``` c
0 commit comments