diff --git a/docs/notes/02_c-leap/08_xdx/index.md b/docs/notes/02_c-leap/08_xdx/index.md index ccd4dfa..3414b1b 100644 --- a/docs/notes/02_c-leap/08_xdx/index.md +++ b/docs/notes/02_c-leap/08_xdx/index.md @@ -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 位无符号整数 | +