今天在學習移位運算符和取反運算符的時候,發現一些問題!現在呢在這里說一下自己的感悟!
先看下面一道 取反和移位相結合的問題
#include<stdio.h>
int main()
{
char a=0x11;
char b;
b=~a<<2;
printf("%d\n",b);
b=~(a<<2);
printf("%d\n",b);
b=~a>>2;
printf("%d\n",b);
b=~(a>>2);
printf("%d\n",b);
return 0;
}
輸出結果是:
-72
-69
-5
-5
剛開始在想為什么相同的操作(只是移位方向不同),為什么上面兩個結果不一樣,而下面兩個結果卻是一樣的呢。有些人在疑問是不是因為下面兩個表達式都是先移位后取反的呢?我可以肯定不是這樣的,但是不能解釋這個結果。這個問題我糾結了半天! 不過對下面的知識了解之后便豁然開朗了。
移位運算符分為左移運算符和右移運算符。
當對一個數執行左移運算的時候,右邊的空位是用0補齊。
而當對一個數執行右移運算的時候,左邊的空位是用符號位補齊的(這是我之前沒注意的地方,慚愧)。
解體步驟如下:
a=0x11=0001 0001
~a=1110 1110
a<<2=0100 0100
a>>2=0000 0100
~a<<2=1011 1000
現在 1011 1000是補碼,轉化成原碼之后是
1100 1000=-72 -72是十進制
~(a<<2)=0100 0100
轉化為原碼之后是 1100 0101=-69
~a>>2=1111 1011(注意現在是用1補齊的,因為~a的符號位是1)
轉化為原碼之后是 1000 0101=-5
~(a>>2)=1111 1011
轉化為原碼之后是 1000 0101=-5
明白之后心情很好,所以在這里分享一下。呵呵