6

私が得られないことがあります:

Cの Asigned charは 8 ビットで表されます。00000000

  • 0 0000 0000=> 0
  • 1 0000 0001=> 1
  • ...
  • 127 は0111 1111=> 127

だから私は8番目のビットが符号ビットだと思った。ので、私は考えました:

  • 128 1000 0000=> 0
  • 129 1000 0001=> -1

しかし、いいえ!

これを試して:

int main(int argc, const char *argv[])
{
    int i;
    for (i = 0; i < 256; i++) {
        printf("%3d = %d\n", i, (signed char)i);
    }
    return 0;
}

そして、あなたは得る:gcc -o tt tt.c ; ./tt | more

  • ...
  • 126 = 126
  • 127 = 127
  • 128 = -128
  • 129 = -127
  • 130 = -126
  • 254 = -2
  • 255 = -1

どうして?

4

5 に答える 5

8

これは、符号付き整数の 2 の補数表現と呼ばれ、すべての整数型に使用されます。

アイデアは次のとおりです。CPU の加算器は、オーバーフローの発生を単純に無視してラップアラウンドするため、実際には数値のモジュロ リングで計算しています。したがって、0 から 1 を引くと、

 00000000 = 0
-00000001 = 1
--------------
 11111111 = -1

等々。

そうすれば、コンピューターは計算中に符号を単純に無視できます。これは、この例の 3 と -2 の乗算 (簡潔にするために 4 ビット演算) のように、乗算にも当てはまります。

0011 * 1110
-----------
       0000
      0011
     0011
    0011
-----------
     101010
truncated to 4 bits: 1010

1010は の負数であり0110、6 であるため、結果は -6 になります。

比較、除算、より大きな整数型へのキャストなど、符号を考慮する必要があるポイントはごくわずかです。比較は比較的簡単で、キャストは次のように機能します。

00000001 -> 0000000000000001
10000000 -> 0000000010000000 (unsigned extension 128 -> 128)
10000000 -> 1111111110000000 (sign extension, the sign bit is copied into all new bits, preserving the value of negative numbers -128 -> -128)
于 2013-08-02T09:44:24.387 に答える
5

これは、8 ビット 2 の補数エンコーディングが原因です。符号付き文字の範囲は -128 ~ 127 です。

EDIT1: @Grijesh のコメントへの応答

-128 と +128 は、10000000 という同じ表現を持ちます。したがって、混乱を避け、ルールを作成するためにAll bit-patterns with 1 in higher-order bit represent negative numbers、-127..+128 ではなく、-128 から 127 の範囲を作る -128 と見なすことにしました。

于 2013-08-02T09:42:48.413 に答える
4

2 の補数では、一番左のビットが負で、残りのビットが正です。

1000 0000

=> -128

1000 0001

=> -128 + 1 = -127

したがって、最大数は 0111 1111 (127) で最小数は 1000 0000 (-128) です。

于 2013-08-02T09:46:27.940 に答える
2

signed datatypes時計と考えることができます。12 時間後には常に 12 時を迎えます。 Char範囲は-128+127です。あなたが127私のクロックルールに従ってヒットすると、次のヒットは になります-128

バイナリ計算を行うことをお勧めします。

詳細については、 http://en.wikipedia.org/wiki/Two%27s_complementを参照してください。

于 2013-08-02T09:45:55.897 に答える
1

c char では、メモリ割り当ては 1 バイトのみであり、合計 8 ビットを意味します。これは 8 ビット 2 の補数エンコーディングによるものです。符号付き文字の範囲は -128 から 127
です。

   printf("%3d = %d\n", i, (signed char)i);
于 2013-08-02T09:48:35.240 に答える