1. 针对定点小数加法运算,分析 产生溢出的原因,并给出两种溢出的方法
(1)产生“溢出”的原因:
当最高有效数值位的运算进位与符号位的运算进位不一致时,将产生运算“溢出”。 当最高有效位产生进位而符号位无进位时,产生上溢; 当最高有效位无进位而符号位有进位时,产生下溢。
(2)“溢出”检测方法:
为了判断“溢出”是否发生,可采用两种检测的方法。
第一种方法:采用双符号位法, 称为“变形补码”或“模4补码”,可使模2补码所能表示的数的范围扩大一倍
第二种溢出检测方法:采用“单符号位法”。当最高有效位产生进位而符号位无进位时,产生上溢;
2. 什么是补码加减运算溢出判别溢出有哪几种方法并我说明工作原理。
通常有三种表述方式(说法):
(1)
两个符号相同的补码数相加,如果和的符号与加数的符号相反,或两个符号相反的补码数相减,差的符号与减数的符号相同,都属于运算结果溢出。这种判别方法比较复杂,要区别加还是减两种不同运算情况,还要检查结果的符号与其中一个操作数的符号的同异,故很少使用;
(2)
两个补码数相加减时,若最高数值位向符号位送的进位值与符号位送向更高位的进位值不相同,也是运算结果溢出。
(3)
在采用双符号位(如定点小数的模4补码)运算时,若两个符号位的得值不同(01或10)则是溢出。01表明两个正数相加,结果大于机器所能表示的最大正数,称为"上溢";10表明两个负数相加,结果小于机器所能表示的最小负数,称为"下溢";双符号位的高位符号位,不管结果溢出否,均是运算结果正确的符号位,这个结论在乘法运算过程中是很有实际意义的。请注意,在采用双符号位的方案中,在寄存器和内存储器存储数据时,只需存一位符号,双符号位仅用在加法器线路部分。
再次强调,这三种不同说法是对同一个事实的略有区别的表述,实现时用到的线路可以有所区别,但问题的实质是完全一样的。
3. 如何判断整数数据的溢出
整数溢出,如何判断整数溢出 收藏
C语言中存在两类整数算术运算,有符号运算和无符号运算。在无符号运算里,没有了符号位,所以是没有溢出的概念的。
所有的无符号运算都是以2的n次方为模。如果算术运算符的一个操作数是有符号书,另一个是无符号数,那么有符号数
会被转换为无符号数(表示范围小的总是被转换为表示范围大的),那么溢出也不会发生。但是,当两个操作数都是有符号数
时,溢出就有可能发生。而且溢出的结果是未定义的。当一个运算的结果发生溢出时,任何假设都是不安全的。
例如,假定a和b是两个非负的整型变量(有符号),我们需要检查a+b是否溢出,一种想当然的方式是:
if (a + b < 0)
溢出;
实际上,在现实世界里,这并不能正常运行。当a+b确实发生溢出时,所有关于结果如何的假设均不可靠。比如,在某些
机器的cpu,加法运算将设置一个内部寄存器为四种状态:正,负,零和溢出。在这种机器上,c编译器完全有理由实现以上
的例子,使得a+b返回的不是负,而是这个内存寄存器的溢出状态。显然,if的判断会失败。
一种正确的方式是将a和b都强制转换为无符号整数:
if ( (unsigned)a + (unsigned)b > INT_MAX)
溢出;
这里的int_max值为有符号整型的最大值。在一般的编译器里是一个预定义的常量。ANSI C在limits里定义了INT_MAX,值为
2的31次方-1.
不需要用到无符号算数运算的另一种可行方法是:
if (a > INT_MAX - b )
溢出;
PS : 有符号数的最高位(31位)为符号位,最高位为0的时候,表示正,为1的时候表示负。运算时,符号位不参加运算,但是如果两个数相加,30位需要进1时,那么即表示溢出。
4. 如何判断运算中的溢出
1、乘法溢出判断方法:
MUL指令:乘积的高一半为0,则没有溢出;否则就有溢出;
IMUL指令:乘积的高一半是低一半的符号扩展时,则没有溢出;否则就有溢出。
2、除法指令对所有条件标志位均无定义。
5. 汇编语言.两有符号数运算,如何自己判断是否溢出
计算机中的溢出,是指数据过大,超出了预定的范围。
八位二进制,可以代表自然数:0~255;
也可以代表整数:-128~+127。
判断溢出,常用的方法:
1。你用十进制,人工计算。和,在容许范围之内,就没有溢出。
这种方法最简单。而且,对无符号数、带符号数,都是适用的。
2。你用二进制,人工计算。和的符号,属于合理,就没有溢出。
这种方法稍稍麻烦。只能判断“带符号数”的溢出。
3。你编个程,让 CPU 计算。如果 OF = 0,就没有溢出。
这种方法,难度较大。
4。你把两个数据,显示出来,求大家帮你判断。
在你那边,网络通了吧。