[学习资料] 如果目标类型的存储范围小于源类型,则可能发生数据丢失。

[复制链接]
1276|6
 楼主| t60yz 发表于 2025-3-24 13:42 | 显示全部楼层 |阅读模式
可能发生数据丢失的情况
如果目标类型的存储范围小于源类型,则可能发生数据丢失。例如:

cpp
复制
编辑
int largeNum = 1000;
char smallNum = (char)largeNum;  // 可能发生溢出
printf("%d\n", smallNum);  // 结果可能不是 1000
char 只能存储 -128 ~ 127(如果是 signed char)。

1000 超出范围,可能导致数据截断或溢出。

在 Python 这种 动态类型 语言中不会有这个问题:

python
复制
编辑
largeNum = 1000
smallNum = chr(largeNum)  # 正常转换
print(smallNum)
但如果 largeNum 超出 chr() 的范围(0~1114111),会抛出异常。

21mengnan 发表于 2025-3-24 16:26 | 显示全部楼层
对,会溢出,甚至跑飞。
xuanhuanzi 发表于 2025-3-25 11:16 | 显示全部楼层
这个情况我遇到过,因为数据类型不同,导致BUG
xinxianshi 发表于 2025-3-27 12:08 | 显示全部楼层
用格式化打印到字符串可以解决很多问题。
灰色与青 发表于 2025-8-29 13:49 | 显示全部楼层
当目标类型存储范围小于源类型时,数据超出目标类型承载上限的部分会丢失。比如 int(4 字节)转 char(1 字节),若 int 值为 300(二进制超 8 位),转 char 后只剩低 8 位,结果为 44,高位数据丢失。又如 float 转 int,小数部分会直接舍弃,这种丢失需提前预判,避免程序逻辑出错。
小岛西岸来信 发表于 2025-9-16 15:48 | 显示全部楼层
当目标类型存储范围小于源类型时,源类型中超出目标类型表示上限的数据会丢失,导致结果失真。比如将 32 位 int 型的 “300”(二进制超出 8 位)赋值给 8 位 unsigned char 型,因 char 最大存 255,最终结果会是 300-256=44;若源数据是负数,赋值给无符号类型,还会因符号位被解读为数值位导致结果完全错误,这就是典型的数据丢失情况。
短句家 发表于 2025-9-19 14:10 | 显示全部楼层
当源类型存储范围大于目标类型时,若源数据超出目标类型的最大值或最小值,就会丢失数据。
比如源是 32 位整数(范围约 - 21 亿到 21 亿),目标是 16 位整数(范围约 - 3 万到 3 万)。若源数据是 10 万,存入目标类型后,会因超出目标上限,最终结果不是 10 万,导致数据失真。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

189

主题

1191

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部