インターネットの学習ノートを使って SCJP 試験の練習をしています。
私のメモによると、>>
演算子は符号付き右シフトで、符号ビットは左から取り込まれます。左シフト演算子<<
は符号ビットを保持することになっていますが。
ただし、いじってみると、<<
演算子で符号をシフトできます (feInteger.MAX_VALUE << 1
は に評価されます-2
が、演算子で符号をシフトすることはできません>>
。
ここで何か誤解しているに違いありませんが、何ですか?
">>" は符号を保持しているため、署名されています。数値の 2 進表現で最も左の桁をフィラーとして使用します。例えば:
| this value is used as a filler
11011011
>> 11101101
01010010
>> 00101001
">>>" は、この演算子の符号なしバージョンです。フィラーとして常にゼロを使用します。
11011011
>>> 01101101
01010010
>>> 00101001
2 進数表現では、最も左の桁が数値の符号を決定します。したがって、「1」の場合は負の値になり、「0」の場合は正の値になります。そのため、一番左の数字をフィラーとして使用すると、符号を永続的に保つことができます。
シフトの背後にある考え方は、シフトが 2 の累乗で乗算および除算として機能できるということです (<< 1 は *= 2 に相当し、>> 2 は /= 4 に相当します)。これが、シフトの符号付きバージョンが存在する理由です。ただし、符号なしシフトは必ずしも符号を保持しません。<< 演算子は、実際には記号を保持しません。あなたの例では単に起こります。2,147,483,647 を左シフトしてみてください。ポジティブにとどまらない。彼らがわざわざ「符号付き」の左シフトを試みない理由は、数値が正から負に (またはその逆に) シフトした場合、とにかく変数型の境界の外に出たからです。