この単純なコードがあります。 誰もが出力がffff
でない理由を説明することができます0fff
??負の数の場合のcの右シフト演算子の操作を理解できません
#include<stdio.h>
int main(){
printf("\n%x",(-1>>4));
return 1;
}
この単純なコードがあります。 誰もが出力がffff
でない理由を説明することができます0fff
??負の数の場合のcの右シフト演算子の操作を理解できません
#include<stdio.h>
int main(){
printf("\n%x",(-1>>4));
return 1;
}
マイナスシフトを避ける方が良いです。 <<
の場合は未定義の動作です。 E1 >> E2
の結果はE1
右シフトE2
ビット位置である
:
>>
ためには、実装定義でありますE1
はunsigned型 を有するか、またはE1
署名タイプと非負の値を有する場合、結果の値はE1/2
E2
の商の整数 一部である場合。E1
に符号付きの型と負の値がある場合、結果の値 は実装定義です。
右シフトでは、空ビットが符号ビットで埋められます。これは、数値が正の場合は0、負の場合は1でそれらを埋めます。
-1 = FFFF = 11111111
あなたが右にシフトした場合は、結果の数が同じになります。
なぜ-1 = ffffであるのか理解できない場合は、2の補数を読みます。ほとんどの言語で使用される符号付き整数の表現です。
"_右シフトは空ビットに符号ビットを埋めます._"これは実際の典型的なケースですが、保証されていません。 – AlexD
私はそれを今得ました。私はシフト中にビットが0だけに置き換えられることを知っていました。 didntは、右シフト中に符号ビット値に置き換えられることを知っていませんでした。ありがとうございました 。 。 @AlexD –
私はもう少し精巧な説明をすることができますか? –
右シフトで負の数がわからない場合は、16で除算するか、先頭の「0」ビットを転記するかを指定します。 –
@AsifAhmed定義されていない動作と実装定義の動作について説明します。 [ここ](http://stackoverflow.com/q/2397984)。おおまかに言えば、コンパイラのドキュメントをチェックするはずです。しかし、とにかく、ネガティブサインをシフトさせないようにしてください。 – AlexD