C++標準を確認しました。次のコードは未定義の動作であってはならないようです:
unsigned int val = 0x0FFFFFFF;
unsigned int res = val >> 34; // res should be 0 by C++ standard,
// but GCC gives warning and res is 67108863
そして標準から:
E1 >> E2 の値は、E1 を右シフトした E2 ビット位置です。E1 が unsigned 型の場合、または E1 が signed 型で負でない値の場合、結果の値は E1/2^E2 の商の整数部分です。E1 に符号付きの型と負の値がある場合、結果の値は実装定義です。
標準では、34 は負の数ではないため、変数res
は 0 になります。
res
GCCは、コード スニペットに対して次の警告を表示します67108863
。
警告: 右シフト数 >= 型の幅
また、GCC によって出力されたアセンブリ コードも確認しました。を呼び出すだけでSHRL
、SHRL の Intel 命令ドキュメントres
は ZERO ではありません。
ということは、GCC は Intel プラットフォームで標準の動作を実装していないということですか?