在網上搜索移碼是什么,大概率會搜到一個結論:移碼是補碼符號位取反,可是真的是這樣嗎?
傳統的有符號整數是將二進制數的首位作為符號位,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的。
如果佬們有異議,請不吝賜教!💖💖💖