首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二元加法中的底流和溢流

二元加法中的底流和溢流
EN

Stack Overflow用户
提问于 2019-02-07 15:09:36
回答 1查看 806关注 0票数 0

在以下情况下:

代码语言:javascript
复制
0b10001111+0b10011000 = 0b100100111 

是地下水流的情况吗?因为这两个词是负的,其结果是正的?

我们什么时候会有溢流?因为第9位永远是1?当第8位都是1

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-07 17:54:27

0b1000 1111+0b1001 1000 = 0b1 0010 0111

包括进位作为n+1th位的结果对于2s补码来说毫无意义。你可以做的是要么坚持原来的尺寸

0b1000 1111+0b1001 1000 =0b00100111 //无效

或者将操作数扩展到n+1位,并得到n+1位的结果。

0b1 1000 1111+0b1 1001 000= 0b1 0010 0111 //有效

原因是2s补码的工作原理是在负整数中添加2^n,使其变为正数。(要编码一个<0=-声

这很好,因为编码值为(2^n)+a if a<0或if a≥0,如果忽略2^n,则可以在不担心操作数符号的情况下进行带符号整数加法。但是你必须忽略执行(除了关于有效性的问题)。

要获得准确的有效性规则,您必须考虑不同的情况:

1/A,B>=0

结果是有效的当且仅当MSB=0⇒c_n-1=0 (而且我们总是有c_n=0)

2/ A,B<0

结果是有效的当且仅当MSB=1⇒c_n-1=1 (而且我们总是有c_n=1)

3/ A>=0,B<0

结果不能太积极或太消极,而且总是有效的。我们总是有c_n=c 1

我们可以看到,指示结果是否有效的全局规则是c_n ==c 1(或c_n⊕c_n-1表示溢出)。

还有许多其他类似的规则。例如:

如果(符号(A) !=符号(B)或(符号(A) ==符号(B))和(符号(A)==sign(A+B)),则结果是有效的。

可以用C表示为

((a^b) | (a^~(a+b)))&(1<< sizeof (int) -1)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54576374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档