溢出和进位

原文地址在   http://blog.sina.com.cn/s/blog_63f7ac2d0100mpvx.html

溢出和进位

  
今天在学ARM的汇编指令的时候遇到进位和溢出的问题,于是在网上搜了一下,把搜到的结果帖出来分享下,是从别人那里直接copy过来了,对作者说声辛苦了,我是转载的!!

对于无符号数来说,不存在溢出的问题,它的进位就相当于有符号数中的溢出
而对有符号数来说,不存在进位的问题

一个字节(8位) 的数有256个 (2的8次方)
一个字(16位) 的数有65536个 (2的16次方)


8个二进制位能够表达的无符号数范围是:0 ~255  
16位表达的无符号数范围是:0 ~65535  

对于无符号数来说,不存在溢出的问题,它的进位就相当于有符号数中的溢出. 
进位表示最高位有没有向上形成进位,或向上形成借位,如果有则进位标志CF为进/借位数,但结果没错。
进/借位数要看十六进制、二进制,进/借的是十六进制、二进制的最高位

处理器内部以补码表示有符号数,
8个二进制位能够表达的有符号数范围是:+127 ~ -128
16位表达的有符号数范围是:+32767 ~ -32768

如果运算结果超出了这个范围,就是产生了溢出,有溢出,说明有符号数的运算结果不正确
溢出是指结束超出数据所表示的范围,通俗地说是装不下了,比如,两个带符号的字节数127和2相加,结果为-1,因为带符号的字节数最大正数为127,所以超过范围,溢出标志位OF为1,说明出错了。
对于有符号数来说,不存在进位的问题 

例如:
3AH + 7CH=B6H,就是58 + 124=182,已经超出-128 ~127范围,产生溢出,所以OF=1;另一方面,补码B6H表达真值是-74,显然运算结果也不正确。

溢出标志OF和进位标志CF是两个意义不同的标志.进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。

请看例子
例1:3AH + 7CH=B6H
无符号数运算:58+124=182,范围内,无进位
有符号数运算: 58+124=182 ,范围外,有溢出
例2:AAH + 7CH=(1)26H
无符号数运算:170+124=294,范围外,有进位
有符号数运算:-86+124=28 ,范围内,无溢出

处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志CF;同时,根据是否超出有符号数的范围设置溢出标志OF。

应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出。

判断运算结果是否溢出有一个简单的规则:只有当两个相同符号数相加,而运算结果的符号与原数据符号相反时,产生溢出,此时的运算结果显然不正确。其他情况下,则不会产生溢出。 

两个正数相加(或一个正数减一个负数)得到负数,或是两个负数相加得到正数,就是溢出了.
一个正数和一个负数相加不可能溢出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值