4

私は C でプログラミングを始めていますが、得られた結果を理解するのに問題があります。ここにコードを貼り付けます:

#include <stdio.h>
unsigned int main(void)
{
    unsigned int x = 0;

    printf("%u\n",x-1);
    return 0;
}

端末は 4.294.967.295 を返していますが、その理由がわかりません。この値が a の最大値であることはわかっていますが、実際には、結果が負であるため、型ではなく型unsigned intを使用する必要があるというコンパイラからの警告を期待していました。とにかく、誰かが私を助けることができますか?intunsigned int

4

7 に答える 7

3

unsigned 型を使用すると、すべてのビットが非負の値 (つまり >= 0) を表すために使用されます。これを値のラップアラウンドと考えてください。したがって、下限 (0) を下回ると、最大値 (32 ビット、2^32 - 1) にラップアラウンドします。

また、 variable に負の値を代入していないことに注意してください。変数xから 1 を引いた式を指定しただけです。すなわち、

x-1

x = x - 1;

ただし、これに関する警告が表示されるかどうかは、おそらくコンパイラと設定された警告レベルに依存します。

于 2012-08-10T13:49:45.517 に答える
1

C標準では、すべての符号なし演算は2 ^ Nを法とする範囲内で行われるとされています。ここで、Nは型のビット数です。したがって、符号なし算術で0から1を引くと、-1にはなりませんが、UINT_MAXになります。

符号なしの値をリングと考えてください。ここで、0はUINT_whateverの横に接着されています。足し算、引き算、シフト、掛け算、さらには否定のいずれであっても、リングを離れることはありません。だからあなたは完全に次のようなことをすることが許されています

 unsigned int x = -1;    /* Assigns UINT_MAX. */ 
于 2012-08-10T14:02:59.370 に答える
1

unsigned intその名の通り看板がありません。

unsigned int値は 32 ビット値として表されるため、1 を減算すると、0x00000000 から 0xFFFFFFFF にロールオーバーされ、取得している 4294967295 が得られます。

于 2012-08-10T13:52:05.370 に答える
1

これは固定ビット数 (32) であり、2 の補数です。

于 2012-08-10T13:50:04.040 に答える
0

unsigned int負の整数を格納できないためです。

1 の補数と 2 の複素数についてよく読んでください。

最上位ビットが他のビットと一緒に設定され、正の数として解釈されるというのはどういうことですか。

于 2012-08-10T13:50:52.703 に答える
0

コンパイラは将来何をするかを知ることができないため、エラーは発生しません。

于 2012-08-10T13:51:15.030 に答える
0

符号なしは、正の値のみを持つことを意味します。コンピュータは、いくつかの規則に従って数値をバイナリとして保存します。0 - 1 を実行すると、最大の int 値が得られます。詳細については、こちらをご覧ください: http://en.wikipedia.org/wiki/Signed_number_representations

于 2012-08-10T13:49:35.563 に答える