This commit is contained in:
许大仙 2024-08-17 14:14:23 +08:00
parent a17bf261e7
commit d141af6616

View File

@ -68,13 +68,22 @@
> [!IMPORTANT]
>
> * ① C 语言默认没有规定各种数据类型所占存储单元的长度,但是通常需要遵守:`sizeof(short int) ≤ sizeof(int) ≤ sizeof(long int) ≤ sizeof(long long)` 具体的存储空间由编译系统自行决定其中sizeof 是测量类型或变量、常量长度的运算符。
> * ② short 至少 2 个字节long 至少 4 个字节。
> * ③ 之所以这么规定,是为了可以让 C 语言长久使用,因为目前主流的 CPU 都是 64 位,但是在 C语言刚刚出现的时候CPU 还是以 8 位和 16 位为主。如果当时就将整型定死为 8 位或 16 位,那么现在我们肯定不会再学习 C 语言了。
> * ④ 数据类型占用的字节数就称为该数据类型的长度步长short 占用 2 个字节的内存,就称 short 的长度(步长)是 2。
> * ⑤ 整型分为有符号 signed 和无符号 unsigned 两种,默认是 signed。
> * ⑥ 在实际开发中,`最常用的整数类型`就是 `int` 类型了,如果取值范围不够,就使用 long 或 long long 。
> * ⑦ C 语言中的`格式占位符`非常多,只需要大致了解即可;因为,我们在实际开发中,一般都会使用 C++ 或 Rust 以及其它的高级编程语言Java 等,早已经解决了需要通过`格式占位符`来输入和输出变量。
> * ① 数据类型在内存中占用的存储单元字节数就称为该数据类型的长度步长short 占用 2 个字节的内存,就称 short 的长度(步长)是 2。
>
> * ② C 语言并没有严格规定各种数据类型在内存中所占存储单元的长度,只做了宽泛的限制:
>
> * short 至少占用 2 个字节的存储单元。
> * int 建议为一个机器字长(指计算机的处理器在一次操作中能够处理的二进制数据的位数,机器字长是处理器的“字”长度,它决定了处理器在一个时钟周期内能够处理的数据量,如:早期的计算机的处理器通常是 8 位的机器字长,意味着处理器一次只能处理 8 位(二进制)数据;之后的计算机的处理器有 16 位的机器字长,意味着处理器一次可以处理 16 位的数据;再之后计算机的处理器有 32 位或 64 位的机器字长,意味着处理器一次可以处理 32 位或 64位的数据。即32 位环境下 int 占用 4 个字节的存储单元64 位环境下 int 占用 8 个字节的存储单元。
> * short 的长度(步长)不能大于 intlong 的长度(步长)不能小于 intlong long 不能小于 long。
>
> * ③ 那么,各种数据类型在内存中所占存储单元的长度的公式就是 `2 ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long)`,具体的存储空间由编译系统自行决定。其中,`sizeof` 是测量类型或变量、常量长度的`运算符`。
> [!IMPORTANT]
>
> * ① 之所以这么规定,是为了可以让 C 语言长久使用,因为目前主流的 CPU 都是 64 位,但是在 C 语言刚刚出现的时候CPU 还是以 8 位和 16 位为主。如果当时就将整型定死为 8 位或 16 位,那么现在我们肯定不会再学习 C 语言了。
> * ② 整型分为有符号 signed 和无符号 unsigned 两种,默认是 signed。
> * ③ 在实际开发中,`最常用的整数类型`就是 `int` 类型了,如果取值范围不够,就使用 long 或 long long 。
> * ④ C 语言中的`格式占位符`非常多,只需要大致了解即可;因为,我们在实际开发中,一般都会使用 C++ 或 Rust 以及其它的高级编程语言Java 等,早已经解决了必须通过`格式占位符`来才能将变量进行输入和输出。
### 1.2.2 短整型(了解)
@ -520,16 +529,13 @@ sizeof(表达式)
> [!NOTE]
>
> * ① 表达式可以是任何类型的数据类型、变量或常量。
> * ② 返回某种数据类型或某个值占用的字节数量(内存中的存储单元),并且 `sizeof(...)` 的`返回值类型`是 `size_t`
> * ③ 在 `printf` 中使用占位符 `%zu` 来处理 `size_t` 类型的值。
> * ④ 之前也提过C 语言没有一个统一的官方机构来制定或强制执行其标准而是由一个标准委员会负责制定标准。不同的编译器可以选择部分或完全遵循这些标准。因此C 语言的编译器实现可能会有所不同,这就要求程序员在编写跨平台代码时特别注意数据类型的大小和布局。
> * ⑤ 与 C 语言不同Java 和 JavaScript 等语言的标准是强制性的。在 Java 语言中,`int` 类型在所有平台上都是 4 个字节,无论是在 Linux、MacOS 还是 Windows 上。因此,这些语言不需要像 C 语言那样依赖 `sizeof` 来处理不同平台上的数据类型大小差异,因为编译器已经在底层处理了这些差异。
> [!IMPORTANT]
> * ① sizeof 是运算符,不是内置函数。
>
> * ① `sizeof` 运算符在 C 语言中的重要性在于它为程序员提供了一个处理不同平台上数据类型大小差异的工具,而 Java 和 JavaScript 由于其标准化的实现,不需要 `sizeof` 这样的工具来保证跨平台的一致性。
>* ② 当然,如果你在 C 语言中使用精确宽度类型int8_t、int16_t、int32_t、uint8_t、 uint16_t、uint32_t 等,也可以确保代码在各个平台上的一致性。
> * ② 表达式可以是任何类型的数据类型、变量或常量。
> * ③ 用来获取某种数据类型、变量或常量占用的字节数量(内存中的存储单元),并且 `sizeof(...)` 的`返回值类型`是 `size_t` ;并且,如果是变量名称,可以省略 `()`;如果是数据类型,则不能省略 `()`
> * ④ 在 `printf` 中使用占位符 `%zu` 来处理 `size_t` 类型的值。
> * ⑤ 之前也提过C 语言没有一个统一的官方机构来制定或强制执行其标准而是由一个标准委员会负责制定标准。不同的编译器可以选择部分或完全遵循这些标准。因此C 语言的编译器实现可能会有所不同,这就要求程序员在编写跨平台代码时特别注意数据类型的大小和布局。
> * ⑥ 与 C 语言不同Java 和 JavaScript 等语言的标准是强制性的。在 Java 语言中,`int` 类型在所有平台上都是 4 个字节,无论是在 Linux、MacOS 还是 Windows 上。因此,这些语言不需要像 C 语言那样依赖 `sizeof` 来处理不同平台上的数据类型大小差异,因为编译器已经在底层处理了这些差异。换言之,`sizeof` 运算符在 C 语言中的重要性在于它为程序员提供了一个处理不同平台上数据类型大小差异的工具。当然,如果你在 C 语言中,使用精确宽度类型,如:`int8_t`、`int16_t`、`int32_t`、`uint8_t`、 `uint16_t`、`uint32_t` 等,也可以确保代码在各个平台上的一致性。