21

インターネットの学習ノートを使って SCJP 試験の練習をしています。

私のメモによると、>>演算子は符号付き右シフトで、符号ビットは左から取り込まれます。左シフト演算子<<は符号ビットを保持することになっていますが。

ただし、いじってみると、<<演算子で符号をシフトできます (feInteger.MAX_VALUE << 1は に評価されます-2が、演算子で符号をシフトすることはできません>>

ここで何か誤解しているに違いありませんが、何ですか?

4

2 に答える 2

51

">>" は符号を保持しているため、署名されています。数値の 2 進表現で最も左の桁をフィラーとして使用します。例えば:

    | this value is used as a filler 
    11011011 
 >> 11101101  

    01010010
 >> 00101001 

">>>" は、この演算子の符号なしバージョンです。フィラーとして常にゼロを使用します。

    11011011 
>>> 01101101  

    01010010
>>> 00101001

2 進数表現では、最も左の桁が数値の符号を決定します。したがって、「1」の場合は負の値になり、「0」の場合は正の値になります。そのため、一番左の数字をフィラーとして使用すると、符号を永続的に保つことができます。

于 2010-02-11T12:38:57.557 に答える
3

シフトの背後にある考え方は、シフトが 2 の累乗で乗算および除算として機能できるということです (<< 1 は *= 2 に相当し、>> 2 は /= 4 に相当します)。これが、シフトの符号付きバージョンが存在する理由です。ただし、符号なしシフトは必ずしも符号を保持しません。<< 演算子は、実際には記号を保持しません。あなたの例では単に起こります。2,147,483,647 を左シフトしてみてください。ポジティブにとどまらない。彼らがわざわざ「符号付き」の左シフトを試みない理由は、数値が正から負に (またはその逆に) シフトした場合、とにかく変数型の境界の外に出たからです。

于 2014-04-28T13:33:55.240 に答える