1. 程式人生 > >程式語言有無符號移位小見

程式語言有無符號移位小見

本篇文章主要是自己對左右移位所學的心得,花了兩個多小時,終於弄明白了,不敢私藏,故拿出來和大家分享,希望大家能更清楚地瞭解計算機語言移位操作。 進入正題前先了解幾個概念:

1. 正負數符號位(最高位),正數為0,負數為1

2. 補碼:正數的補碼為其本身,負數的補碼是其絕對值的原碼最高位符號位不變,其它位取反,再加1,例如:8位的-1,其原碼為1000 0001,其補碼為1111 1110+1=1111 1111

3.

無符號左移:每左移一位,高位移出,在低位補一個0

無符號右移:每右移一位,低位移出,在高位補一個0

有符號左移:每左移一位,高位移出,在低位補一個0

有符號右移:每右移一位,低位移出,如果是正數,即高位符號位為0,則移位時在高位補0,如果為負數,即高位符號位為1,則移位時在高位補1.

因為“i=0X4001”這條語句是直接把暫存器的16個位直接寫成:0100 0000 0000 0001 ,所以輸出為+1=16385

左移1位為1000 0000 0000 0010,注意所有的移位都是直接對暫存器操作的,此時最高位為1,所以系統將其當作負數,輸出其值時,系統會自動輸出暫存器中的數的補碼形式,即1111 1111 1111 1110,所以輸出為 -2=-32766,最高位是符號位,別算進去了。(簡易演算法:上二進位制數加2可以得1100 0000 0000 0000,即=32768)

右移還是直接對暫存器操作,所以右移1位為1100 0000 0000 0001,同樣還是負數,輸出時系統會自動輸出暫存器中的補碼形式,即1011 1111 1111 1111,即=-16383

注意:

  1. 暫存器裡的數本身為正的話,輸出時系統不是輸出補碼存i的暫存器裡各位為0100 0000 0000 0001,右移一位為:0010 0000 0000 0000,即=8192
  2. 賦值的時候i=-1與i=0X1001不一樣“i=-1”,意思是i的值為-1,存到暫存器裡的格式為其補碼形式,即1000 0000 0000 0001的補碼,即1111 1111 1111 1111,此時右移是對暫存器直接操作,右移後為:1111 1111 1111 1111,不變,因為是負數,所以輸出時系統直接輸出暫存器中的補碼形式,即1000 0000 0000 0001,即為-1“i=0X8001”,意思是儲存i的暫存器的各位為:1000 0000 0000 0001,此時,i的值其實為:-32767。此時,右移一位,即為:1100 0000 0000 0000,因為其為負數,所以輸出時系統自動輸出暫存器中的補碼形式,即1011 1111 1111 1111+1=1100 0000 0000 0000,即
    =-16384