main( ){
char
c=
040
;
printf(“%o
\n",c<<
1
);
}
按照上面的運算規則,我們先將12轉換為二進制,為1100,進行位邏輯反運算,則為0011,化為十進制數結果應為3才對啊,那為什么測試的結果是-13呢?
原來啊,在計算機中,二進制的存儲方式是以補碼的形式存儲的。
所以,12在計算機內存儲的是01100(第一個0位符號位,代表這個數是正數),對其進行邏輯反運算則為10011,但這個二進制只是b這個變量在計算機內的存儲形式(即b的補碼形式),所以我們需要將其轉換為原碼形式,由於符號位為1,為負數,所以我們先對10011轉換為反碼,即11100,再對其進行+1,所以結果為11101,轉換為十進制數則為-13。所以b=-13。
計算機中打印的二進制都是補碼的形式
正數原碼、反碼、補碼 三碼合一
負數的原碼轉換為補碼為 符號位不變 數值位按位取反 末位加一
負數,補碼的補碼等於原碼 反碼為正 三碼合一
(5)右移操作運算規則:左邊空出的位用0或者1填補。正數用0填補,負數用1填補。注:不同的環境填補方式可能不同;低位右移溢出則舍棄該位。
a=127,轉換為二進制為01111111,由於二進制在計算機內部是以補碼的形式進行存儲,但由於127是正數,所以其補碼為01111111,對該補碼進行右移操作運算,按照運算規則,得到00011111,轉換為原碼,依舊為00011111,轉換為十進制數為31,所以,b=31。
a=-127,轉換為二進制為1000 0111 1111,轉換為反碼為1111 1000 0000,轉換為補碼是1111 1000 0001,對其進行左移三位的操作,得到:1100 0000 1000,將其轉換為反碼:1100 0000 0111,再將其轉換為原碼:1011 1111 1000,轉換為十進制數,為-1016,所以b=-1016。
對多組數據進行測試,我們可以得到這樣一個規律:
當一個數進行n位的左移操作后,所得到的新的數=被操作數*2^n.