溢出和进位标志

6

两个有符号的8位数相加并将进位和溢出标志都设置为1,这是否可能?


这有点取决于处理器,不是吗? - dmckee --- ex-moderator kitten
我已经从标题和标签中删除了 C 的参考,因为这个问题是关于 CPU 操作而不是 C 语言的。 - Steve Jessop
3个回答

6
根据您的评论,您的问题似乎是“在涉及有符号数的二进制补码加法中,是否可能同时设置进位和溢出?” 是可以的。典型的实现方法是将最后一个加法器的进位输入与链末的进位输出进行异或运算——因此,负数的溢出加法将导致进位输出位被设置并且溢出位被设置。
以下是一个例子,将-1加到-128:
Carry 10000 0000 
       1000 0000  (-128)
       1111 1111  (-1)
       ---------
       0111 1111 (oops, this is 127!)

由于最后一次加法产生了进位,进位标志Carry将被设置,根据上述规则将设置溢出标志Overflow(还要注意-128加-1显然不是127)。


非常感谢您的解释,现在我对此有了更清晰的理解。 - freezie

1

在 C 语言中,您无法访问标志,即使您可以让编译器生成设置它们的代码,也没有办法使用它们。


我认为他没有问如何更改标志。他问的是在执行单个操作时是否可以同时更改两个标志。 - jojo
这就是我所问的,它们能否在单个操作中同时更改。 - freezie
1
由于C语言没有进位/溢出标志的概念,所以你不能这样做 - 除非你的特定C编译器有一个告诉你不同的扩展。 - nos
更不用说并非所有具有C编译器的处理器都具备8位ADD指令。但是如果问题是“一般而言”,加法是否可以同时设置进位和溢出,答案是肯定的。 - John Knoeller
1
@Justin:仅仅因为CPU有一个8位加法操作并不意味着在你像问题中一样将两个8位数字相加时C实现会使用它。C算术运算永远不会在比int类型更小的类型上“逻辑”执行,因此您依赖于特定的代码转换/优化。无论如何,我已经从标题和标签中删除了对C的引用,因为实际问题与C无关。 - Steve Jessop
显示剩余4条评论

0

你可以用C语言编写自己的添加程序,以返回有符号8位操作数的进位和溢出标志。如果你指的是处理器内部的硬件进位和溢出位,那么不,这不能在C中进行可移植性的实现。


在一般情况下,你根本不知道那件事。 - dmckee --- ex-moderator kitten
@dmckee:我不确定你在这里想表达什么。一个人肯定可以编写一个“add”例程,在纯粹、可移植的C中返回进位和溢出标志。与内联汇编或其他平台特定的黑客相比,它会非常缓慢,但这不是问题的关键... - Jim Lewis
啊...我没有读到你的“可移植”这个词。我想我们是在同一个页面上。当然,如果没有非标准扩展,你不能做任何有用的事情。 - dmckee --- ex-moderator kitten
作为一名有抱负的语言律师,我感谢您对我善于使用模棱两可措辞的赞扬! - Jim Lewis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接