1和2的补码系统

3

我正在努力理解这两个系统之间的差异以及它们对C编程的影响。

根据我从维基百科上了解到的:

  1. 这两个系统都用于表示负数
  2. 反码对负数应用按位NOT运算(该系统有+0和-0)
  3. 补码与步骤2相同,但加1(消除+/-0)

我还漏掉了什么吗?

我的问题:

  1. 哪些架构支持哪个系统?现在最常见的是哪一个(1的补码还是2的补码)?
  2. 在C语言编程时应该如何考虑这些系统?它只在嵌入式世界中才有意义吗?

提前感谢!

2个回答

4
现在大多数系统使用二进制补码,因为它使计算机可以执行相同的加减运算而不必考虑数字的特定符号。
在编程时,算术运算与所使用的系统无关 - 数据类型的范围由语言定义,因此如果它说某个类型将在-2 ^ 31到+2 ^ 31-1的范围内工作,那么它将在任何表示法下都能工作。但是,当涉及到单个位或位移时,需要小心 - 在非二进制补码系统中,这些操作不会像二进制补码系统中的2次幂算术那样工作(尽管如果您只是使用个人计算机,您不太可能遇到这种系统,甚至永远不会遇到)。

0
仅补码符号表示法的优点是,它允许在不使用进位链的情况下执行从和到符号-幅度形式的转换。如果寄存器使用补码形式而不是二进制补码形式,则构建一个显示每个寄存器值的符号-幅度形式的闪烁灯集合的计算机将更加方便。如果想要为闪烁灯和CPU寄存器使用单独的存储锁存器,则最简单的方法是有一个电路,将二进制补码转换为补码或符号-幅度形式,然后每个寄存器同时将二进制补码值写入寄存器,同时更新闪烁灯锁存器的符号-幅度值。然而,锁存电路的成本相当昂贵,如果寄存器已经由离散锁存器构建,那么添加一些电路使其使用补码,然后从CPU的“真实”寄存器中提供信号给灯,可能比包括额外的锁存器组更便宜。
当然,在过去的几十年中,不同电路元件的相对成本已经发生了变化,直接将灯连接到CPU寄存器的状态上报是荒谬的。因此,过去补码设计可能具有的实际优势已不再适用。

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