我试图了解这两个系统之间的差异以及它们对 C 编程的影响。
根据我从 Wikipedia 中了解到的信息:
- 两个系统都用于表示负数
- 一个补码按位不应用于负数(系统有 +0 和 -0)
- 二进制补码与第 2 步一样并加 1(消除 +/-0)
我还缺少其他东西吗?
我的问题:
- 哪些架构支持哪些系统?现在最常见的是什么(1 或 2 的补码)?
- 在用 C 编程时,我们应该在什么意义上考虑这些系统?它主要只在嵌入式世界中有意义吗?
提前致谢!
我试图了解这两个系统之间的差异以及它们对 C 编程的影响。
根据我从 Wikipedia 中了解到的信息:
我还缺少其他东西吗?
我的问题:
提前致谢!
现在大多数系统都使用二进制补码,因为它可以让计算机在不关心数字的特定符号的情况下执行相同的加法/减法运算。
当你在编程时,无论使用什么系统,算法都可以工作——数据类型的范围是由语言定义的,所以如果它说一个类型将在 -2^31 到 +2^31 - 1 范围内工作,那么无论符号如何,它都会起作用。但是,在处理单个位或位移时需要小心——它们在非二进制补码系统中的行为不像二次幂算术(尽管你不太可能遇到这样的系统,并且可能永远不会,如果您只是在使用 PC)。
整数的一个补码表示法的唯一优点是它允许在没有进位链的情况下执行符号大小形式的转换。如果寄存器使用反码形式比使用反码形式的寄存器使用一组闪烁灯以符号幅度形式显示每个寄存器的值,那么构建一台计算机会方便得多。如果想要为闪烁灯和 CPU 的寄存器使用单独的存储锁存器,最简单的方法是使用一个电路将二进制补码转换为一个补码或符号幅度形式,然后让每个寄存器同时写入将二进制补码值存储在寄存器中,同时使用符号幅度值更新闪烁灯锁存器。
当然,在过去的几十年里,不同电路元件的相对成本已经转移到让灯直接报告 CPU 寄存器状态的程度是荒谬的。因此,one-complement 设计在过去可能具有的实际优势不再适用。