星期三, 1月 25, 2006

Sign, Unsigned 和 shift right

偵測按鍵Code :
char rc=0;
for(i=0;i<8;i++){
rc = rc >> 1;
if(key)
rc = rc | 0x80;
}
結果:
出來的rc 都是:1000b, 1100b, 1110b, 1111b 這幾個pattern。
實際應該要是 : 1000b, 0100b, 0010b,0001b 才對。

也就是說,因為right shift的原因,high bits被keeps住了。

這是因為rc 宣告成signed 的原因,因為是sign,所以shift時會keep sign bit:

0000
1000 - 按鍵1
1100 - shift right 後應該是0100, 但是因為最高bit是正負號,所以compiler會保存正負號,所以又把1000加回去,變成1100。

以上問題解決的方式就是:改為宣告unsigned char rc。



有些compiler (例如: pic - hitech C,的compiler)會有option : treate char as unsigned。
這個option會讓所有宣告char的variable都當作是unsigned char。
所以沒有上面的問題(但是int時一樣會發生)。
所以最保險的方式就是 依照變數特性正確的宣告sign/unsigned。




正確的宣告sign/unsigned 麻煩的的地方是等號運算和function 參數。
等號兩邊變數的sign/unsigned 宣告不同時,會出現error。
同理,function參數prototyping和實際呼叫時放入的參數sign/unsigned 不同時也會warnning。
所以?

沒有留言:

網誌存檔