一、概念
在类似C这样的非高级语言存在数值溢出问题,简单概括:高位数据丢失被低位数据占据位置。
二、举例
2.1 以C语言 for循环为例
/*int8_t value range from -128 to 127*/
int8_t input;
for (input = 124; input < 130; input++) {
printf("%d\n",input);
}
测试数据类型:int8_t 取值范围【-128,127】
对应的十进制127+1之后会怎样?
没错,对应的十进制超过127+1 变成了-128
对应的二进制111 11111 +1= 1000 0000
继续累加直到十进制变成-1
二进制变成1111 1111
继续+1会怎样?
没错变成零了。至此这个for循环变成了一个死循环~这就是数值溢出的危害!
2.2 原因分析
问题1:int8_t 十进制127+1 为何变成-128?
我们用到的int8_t是一个有符号类型的整数 最高位表示符号位(0表示正数、1表示负数);
从二进制角度分析111 11111 +1= 1000 0000 ,此刻数值位侵占了最高位符号位(最高位1既表示符号为负,也表示数值)
计算机中数据存储格式是以补码形式存在的,正数的原码、反码、补码均一致;
而负数的原码则需要转换一下,负数的补码转换成原码 :需要取反再加1。
1000 0000转换成原码
取反:0111 1111
加1:1000 0000
对应十进制为128
在加上符号位-
对应的十进制数值即为-128
同理 我们看到的1111 1111 也是负数补码形式 取反:0000 0000,加1:0000 0001,最后记得加符号,对应十进制为-1
问题2:二进制变成1111 1111 在加1为何变成0?
int8_t 只给我们提供了8位 ,1111 1111 +1 = 1 0000 0000,最高位的1没有空间存储丢失了!
所以显示是0.
三、如何应对数值溢出
注意各个数值的使用范围。
关注我的公众号(桂圆学AI)分享有用的AI工具