计算机基础|数据溢出

一、概念

在类似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工具

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值