9

何かを明らかにしようとしている。

算術的、論理的なビット単位のシフトに関しては、次のように理解しています。

  1. <<両方で同じように動作します
  2. >>シフトは、論理シフトがバイトに常に 0 を埋め込むのに対し、算術シフトはバイトに符号ビットを埋め込むという点で異なります。

Cを使用してこれをどのように区別できますか?

私が理解していることから、実際のオペレーターは同じ<<です、>>

コマンドの違いは次のとおりです。

int i=1;
printf ("%d\n", i >> 1); // logical shift

int j=1;
printf ("%d\n", j >> 1); // arithmetical shift

私にお知らせください、

4

1 に答える 1

15

負でない数の場合、両方の種類の右シフトは同じです。違いは、シフトする数が負の場合にのみ表示されます。

>>実際には、C 標準では、数値が負の場合にいつ論理シフトまたは算術シフトを実行するかを指定していませんが、通常は算術シフトを実行します。論理シフトを実行するには、数値を対応する符号なし型にキャストする必要があります。次に例を示します。

int x = -2;
int y = x >> 1;    // arithmetic shift.
assert (y == -1);
int z = (unsigned)x >> 1;  // logical shift.
assert (z == 0x7FFFFFFF);
于 2010-09-13T17:54:56.323 に答える