3

はこの質問を調べて、 Javaを含むほとんどの言語に算術左シフト演算子がない理由を理解しました。しかし、左シフトすると負の整数が破棄されるため、負の整数をどのように処理しますか。たとえば、-2 ^ 5の場合、結果は負になります。

4

2 に答える 2

9

いいえ、オーバーフローをコミットしない限り、左シフトによって符号ビットがスローされることはありません。理由?2の補数エンコーディングでは、負の数は左側にすべて1があり、正の数はすべて0になります。これは、符号ビットが右側に複製されているようなものです。ところで、これがまさに「符号拡張」という用語が理にかなっている理由です。これが、Javaでデフォルトの右シフトがどのように機能するかです。

  int i = -1;
  System.out.format("%3d = %s\n", i, Integer.toBinaryString(i));
  i <<= 5;
  System.out.format("%3d = %s\n", i, Integer.toBinaryString(i));

プリント

 -1 = 11111111111111111111111111111111
-32 = 11111111111111111111111111100000
于 2012-08-23T11:51:27.753 に答える
0

そのための私の最善の答えは、手術の前後に記号を変更することです。あまりにも明白に見えるかもしれませんが、重要なのは、符号が変わるとビットが特定の方法で変更されるということです

于 2012-08-23T11:54:43.523 に答える