在网上搜索移码是什么,大概率会搜到一个结论:移码是补码符号位取反,可是真的是这样吗?
传统的有符号整数是将二进制数的首位作为符号位,0表示正数,1表示负数。
但在移码中,我们不再使用单独的符号位来表示正负。而是通过一个固定的偏置量来将所有可能的指数值映射到一个无符号的整数范围内。所以移码也叫偏置表示法。对于IEEE 754浮点数标准,这个偏置量通常是,其中(k)是阶码的位数。例如,对于单精度浮点数,阶码有8位,那么偏置量是=127。至于为什么要设置为127,可以看看这篇:
计算机组成原理 - 浮点数偏移量为127的理解 - amazzzzzing - 博客园 (cnblogs.com)
也就是说,在移码中,我们讨论的仍然是有符号整数,只是通过一个偏置量使得所有的表示都是非负的。阶码占据8位,他能表示的无符号整数就是0~255(2^8=256)。然而,由于IEEE 754标准中需要为特殊值(如无穷大、非数字NaN等)保留一些阶码值,因此不是所有的256个值都用于表示真值指数。
当阶码为0时,真值指数 = 0 - 127 = -127。但是,在IEEE 754标准中,阶码为0(0000 0000)时用于表示非规格化数或零,所以阶码的最小值是1。同理,阶码为255(1111 1111)时,用于表示无穷大(Infinity)或非数字(NaN)。所以阶码的最大值是254,对应的真值指数就是-126(1 - 127) ~ 127(254 - 127)。
所以移码的运算(以-2为例):
真值指数是-2,偏置值是127,移码=-2+127=125,二进制表示为0111 1101,所以阶码=0111 1101。这才是移码真正的运算方式,如果照网上说的:"补码符号位取反",-2的移码=0111 1110。可以看到这两个值是不等的。
对于网上说的"移码是补码符号位取反",只有在偏移量为128的情况才能实现。而且只是数值上恰好相等,实际运算中还是要依靠偏置值来算移码,所以移码和补码本质上没有什么关系。而在IEEE 754标准中,偏移量是被设为127的。
如果佬们有异议,请不吝赐教!💖💖💖