2017-03-11 24 views
0

C++で11ビットの数値を32ビットの数値に符号拡張するにはどうすればよいですか?符号が11ビットから32ビットに拡張されます

私は、以下の機能を持っていますが、予想通り、それは適切な符号拡張を返していません。

unsigned int signExtend11to32ui(int i) { 
    int mask = 2047; // 0x7FF or 0000 0111 1111 1111 
    return static_cast<unsigned int>(static_cast<int>(i & mask)); 
} 

次の関数は、32ビットに16ビットの符号拡張のために正常に動作します:

unsigned int signExtend16to32ui(short i) { 
    return static_cast<unsigned int>(static_cast<int>(i)); 
} 
+0

何が返され、何を期待していますか?小さな例ですか? – hmatar

答えて

2

左右のシフトはC++で算術ているので、あなたは右のあなたはint型の最上位ビットまでの整数、その​​後、バックシフトすることができます:

std::int32_t i = 2047; 
i = (i << 21) >> 21; 

これが-1になると、i

+3

これはテストに合格する可能性がありますが、符号ビットにシフトしたり、負の値を右シフトした結果は明確に定義されていません。 –

+0

@BoPersson正しいシフトがうまく定義されていないともっと詳しく説明できますか? –

+2

@ErikP。 - 「E1 >> E2」の値は、E1の右シフトE2ビット位置です。[...] E1に符号付きの型と負の値がある場合、結果の値は実装です定義されています。 "*したがって、使用しているシステムに応じて動作するか動作しない可能性があります。コンパイラのマニュアルを読んで、それが何をしているのかを見なければなりません。 –

関連する問題