連鎖ビットシフト演算が連鎖しないのと同じ結果を返さない理由がわかりません。Cでビットシフト演算子を連鎖した後に予期しない結果が発生しました
#include <stdio.h>
void bit_manip_func(unsigned char byte)
{
unsigned char chain = (((byte >> 3) << 7) >> 3);
printf("%d\n", chain); //this prints 144
unsigned char o1 = byte >> 3;
unsigned char o2 = o1 << 7;
unsigned char o3 = o2 >> 3;
printf("%d\n", o3); //this prints 16 as expected
}
int main()
{
//expecting both printf's to print
//the same value (16).
bit_manip_func(73);
return 0;
}
私はバイナリで73以来、16をプリントアウトするために、両方のprintf
呼び出しを期待していは0100 1001ですbyte >> 3
を適用した後、私は0000 1001を取得する必要があり、(byte >> 3) << 7
後に結果を1000 0000であるべきであり、(((byte >> 3) << 7) >> 3)
後の結果がすべき0001 0000、もちろん16です。実際に何が起こっていますか?
unsigned char chain = (((byte >> 3) << 7) >> 3);
((byte >> 3) << 7)
で
[整数プロモーション](http://www.idryman.org/blog/2012/11/21/整数昇進/)、毎回このような質問が尋ねられます。 – Groo
かもしれませんが、整数昇格とは何の関係もありませんでした。 – cuvidk
'int'はCの特別な型であり、計算の間にすべての小さな型が' int'に昇格することを覚えておくことが重要なルールです。 16ビットアーキテクチャ( 'int'は16ビット幅)用にコンパイルされたソースコードは、32ビット用にコンパイルされたときの動作が異なります。 – Groo