date
icon
password
博客链接
Pin
Pin
Hide-in-Web
Hide-in-Web
网址
type
slug
tags
category
bottom
bottom
Hide-in-Config
Hide-in-Config
comment
status
summary
数据溢出的判断和处理方法:
数据溢出是指在补码运算中,数值位表示的数值超过了补码所能表示的范围,导致结果出错。
一定要是最终算出的结果超出了补码所能表示的范围才能叫溢出,假如一个数是 5 位的,那么最终数的范围应该在 ,即 -16 ~ 15。
对于这个式子,15 +(-13)=2,二进制表达的形式是
01111
+ 10011
——————
1 00010
最终的结果中虽然最高位有 1 溢出了,但是由于计算结果为 2 在上述范围内,因此没有产生溢出。
💡
需要注意的是,只有正数和正数相加或是负数和负数相加的时候,计算结果才有可能会超出数的范围,如果是不同符号的数字,即正数负数相加,两个数字的和会比它们两个中的任何一个都更接近0,和的大小小于任何一个原始数的大小,因此不会发生溢出

溢出的判断方法:
  • 一种是直接看符号位,正数加正数等于负数或负数加负数等于正数都可能溢出(正数和负数相加不会产生溢出);
  • 另一种是双符号位法,即通过判断符号位和进位状态来确定是否溢出。双符号位法是传统的方法。数据溢出的判断,以八位补码为例,阐述了溢出的原因和表现形式。
对于第一种方法,如果符号位相加后的符号位发生了变化则产生了溢出,如 1,000 + 1,000 = 10,000 = 0,000 (第一位舍弃),符号位发生了变化,负数加负数等于正数,因此发生了溢出。
对于第二种方法,双符号位指的是 ,其中 的进位, 的进位,也就是 ;如 1, 000 + 1, 100 中 。如果是 正数和正数相加,则 ,如果是 负数和负数相加,则 ;如果最高有效位能够对符号位造成影响,则 ,如果不能对符号位造成影响,则
至于为什么要引入 这两个量,可以从上面的分析中得到一些启示。因为 这个量可以用于确定是正数和正数相加还是负数和负数相加, 这个量则是用于判断两个数的相加是否会对符号位产生影响。通过这两个量,便可以很方便的用电路来实现溢出的判断。
notion image
notion image
notion image
 
 
 
notion image
 
 
 
 
notion image
 
💡
相同的时候,不会发生溢出;当 不同的时候,会发生溢出。
当发生溢出的时候,解决的方法是扩展符号位(因为扩展符号位后,就能够增加表示的数的范围了),负数通过补码向前扩展 1 来增加位数,值不变,正数通过补码向前扩展 0 来增加符号位,值不变。如 1010 (表示 -2,补码为 1110),扩展为 8 位后补码变成 11111110。
上图中  和  表示的是符号位。
上图中 表示的是符号位。
因此在上面这幅图中,通过异或运算来判断符号位的进位 (即 )和 最高有效位的进位 (即 )是否不同进而判断是否有溢出现象的出现。
 
Loading...