そのため、整数から特定のビット x から y の整数値を取得するための非常に短い関数をテストしようとしていましたが、発生している符号拡張に問題があります。unsigned int にキャストしてから unsigned int を使用してシフトしようとしましたが、うまくいかないようです。コードは次のとおりです。
#include <stdio.h>
int main()
{
int bo_bits = 2;
int tag_bits = 28;
int addr = 1;
unsigned int index = (unsigned int)addr;
index = index << tag_bits;
index = index >> bo_bits;
// at this point I would return (int)index;
return 0;
}
符号なし整数のみをシフトしたため、符号拡張が発生している理由がわかりません。また、「addr」だけを使用してコードを実行し、符号なし int として使用しましたが、出力も変更されませんでした。
Linux マシンの gdb で関数を実行すると、index の出力値は 536870912 になり、オンラインでコンパイルすると (現在はコーディング グラウンド)、得られる値は 67108864 です。
編集: 値 536870912 を取得する方法をいくつかの人が尋ねてきました。両方のブレークポイントを介して gdb を実行し、p get_index(1)
gdb からコマンドを実行して取得しました。実際のコードは次のとおりです。
unsigned int index = (unsigned int)addr;
index = index << tag_bits;
index = index >> bo_bits;
return (int)index;
助けてくれてありがとう!