为什么非要用移码而不是原码来比较整数大小?

为什么非要用移码而不是原码来比较整数大小?

· json · rss
Subscribe:

About

因为移码是比较数字大小的编程量最小方法。

给你两个原码你要怎么比较大小呢?(注意,这个时候你只有硬件可以使用,既且或非移位)

例如0 1101111和1 0010010,又比如111000和100111

我们来画一个流程图,看看原码比较大小模型下的复杂程度。

你看要直接比较原码大小这么复杂,因此在比大小的时候往往会使用移码比较。

移码是什么?

移码本质是这个公式: a=(b+128) \mod 256 .

.我们小学二年级真的就学过这个公式 a>b\Leftrightarrow a+128>b+128

这个公式帮助我们将数字从 [-127,127]\Rightarrow[1,255] .其中[1,255]都是正数,我们只需要从高位1的出现,就可以快速的判断出大小。

至于小数和整数本质没有区别,小数也可以生成自己的移码。

Tip:移码表示中,0有唯一的编码——1000…00,当出现000…00时(表示-2En),属于浮点数下溢。因此不考虑负0的比较大小问题。

因此我们可以很少的硬件部分就实现了两个数的大小比较,这样才有利于提高速度。

Tips:在IEEE 754当中,阶码也是移码,但是它的偏置值是127,也就是说 [-126,127]\Rightarrow[1,254]

那如果阶码出现了0或者255会出现什么情况呢?

如果阶码是0的话,符号位是0,则这个数是正0.符号为1的话是负0.

如果阶码是255的话,符号位是0,则这个数是正无穷,符号位是1的话则是负无穷。

引入这两个数字的情况下,是为了计算出现异常情况下,依然将程序继续进行下去。

推荐一本好书,欢迎大家购买。