1. 無符號數、補碼、反碼、原碼
對於向量x=[xw-1,xw-2,...,x0], 其中xi取0或1
無符號數:
原碼:
最高位表示符號位,其余位表示值 。例如,[1111 1111, 0111 1111] = [-127,127]
反碼:
正數的補碼是其本身,而負數的補碼是在原碼的基礎上,最高位不變,其他位取反。
補碼:
正數的補碼是其本身,而負數的補碼是在原碼的基礎上,最高位不變,其他位取反,最后加1(即在反碼的基礎上加1)。
2. 區分補碼、原碼和反碼的意義
使用原碼時,人腦可以理解最高位代表正負號的含義,但是對於機器來說,在識別數字的同時還有區分出正負號,會對機器帶來極大的負擔。
於是使用補碼和反碼來幫助機器理解如何將符號位加入運算。
反碼的出現時為了解決原碼做減法的問題
例如計算:1-1 = 1+(-1)=[0000 0001]原+[1000 0001]原 = [0000 0001]反+[1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
然而,在實際中並沒有對-0和+0進行區分,因而引入了補碼來解決0的符號問題
例如計算:1-1 = 1+(-1)=[0000 0001]原+[1000 0001]原 = [0000 0001]補+[1111 1111]補 = [0000 0000]補 = [0000 0000]原 = 0
除此之外:(-1)+(-127) = [1000 0001]原+[1111 1111]原 = [1111 1111]補+[1000 0001]補 = [1000 0000]補 = -128
從而使用補碼,還能多表示一個最低數。因而,使用原碼和反碼表示的范圍為[-127,127],而使用補碼時范圍為[-128,127]
3. 移位運算
對於左移操作(<<)而言。不管是有符號數還是無符號數,x<<k,都是對於x而言,丟棄最高K位,並在右邊末端添上k個0。
而對於右移操作(>>)而言,則分為邏輯右移和算術右移。其中邏輯右移在左端補k個0,而算術右移則是在左端補上k個最高位。
操作 | 值 |
x | [1001 0101] |
x << 4 | [0101 0000] |
x >> 4(邏輯右移) | [0000 1001] |
x >> 4 (算術右移) | [1111 1001] |
(以下二進制均為補碼表示,即移位是用補碼進行的(這是因為計算機中用的是補碼表示))
左移操作相當於乘以2的k次方;而右移操作相當於除以2的k次方 (均只適用於被舍棄的高位不含1的情況)