2024年10月15日 14:24

This commit is contained in:
许大仙 2024-10-15 06:24:48 +00:00
parent 09b7eb4fed
commit 9ed9ece69c

View File

@ -822,3 +822,35 @@ int main() {
int num = 100000;
```
> [!NOTE]
>
> * ① 上述的代码在 int 类型是 4 个字节的内存空间下是没有什么问题的。
> * ② 但是,如果 int 类型是 2 个字节的内存空间,就会出现数据溢出现象,将会出现数据精度丢失甚至数据错误的!!!
* 那么,如何避免这种情况?
> [!NOTE]
>
> * ① 直接将 num 的类型变更为更大的数据类型long 等,在进行程序移植的时候,就避免了数据溢出现象。
> * ② 为每个平台选择合适的类型:原平台继续使用 int ,而新的平台使用更大的类型 long 。
* 如果选择上述的方案 ① ,将会造成内存浪费,因为在 32 位的机器上,使用 int 完全可以装得下,却去使用 long 来进行存储。那么,就只剩下方案 ② 了。
> [!NOTE]
>
> * ① 我们在原平台,将 int 类型定义为别名 BigInteger ,如:`typedef int BigInteger`。
> * ② 我们在新的平台,将 long 类型定义为别名 BigInteger`typedef long BitInteger`。
> * ③ 这样,我们在所有的平台都使用 BitInteger 来存储整数,就可以解决跨平台程序移植的问题。
> * ④ 其实C 语言规范的实现者,也为我们想到了这种问题的解决方案,其提供了`精确宽度类型`就是为了解决 C 程序中整数类型跨平台移植的问题,如下所示:
>
> | 类型名称 | 含义 |
> | :------- | :-------------- |
> | int8_t | 8 位有符号整数 |
> | int16_t | 16 位有符号整数 |
> | int32_t | 32 位有符号整数 |
> | int64_t | 64 位有符号整数 |
> | uint8_t | 8 位无符号整数 |
> | uint16_t | 16 位无符号整数 |
> | uint32_t | 32 位无符号整数 |
> | uint64_t | 64 位无符号整数 |