このリンクからここで整数の符号を計算します
int v; // we want to find the sign of v
int sign; // the result goes here
sign = v >> (sizeof(int) * CHAR_BIT - 1);
// CHAR_BIT is the number of bits per byte (normally 8)
これを正しく理解している場合、 sizeof(int) = 4 バイト => 32 ビットの場合
MSB または 32 番目のビットは符号用に予約されています。したがって、(sizeof(int) * CHAR_BIT - 1) だけ右にシフトし、すべてのビットが右側から落ちて、前の MSB のみをインデックス 0 に残します。MSB が 1 の場合 => v が負の場合、それ以外の場合は正です。
私の理解は正しいですか?
もしそうなら、このアプローチがアーキテクチャ固有であるということで、著者がここで何を意味しているのかを誰かが説明してもらえますか:
符号付き整数が右にシフトされると、左端のビットの値が他のビットにコピーされるため、このトリックは機能します。左端のビットは、値が負の場合は 1、それ以外の場合は 0 です。すべて 1 のビットは -1 になります。残念ながら、この動作はアーキテクチャ固有です。
これは、32 ビットまたは 64 ビット アーキテクチャでどのように異なるのでしょうか?