0

unsigned intが負の値をとっている理由を誰かが説明できますか?unsigned intは正の値のみを取る必要があります。

ウィキペディアから:

word、long、doubleword、longword、int

符号なし:0から4,294,967,295まで。これは2 ^ 32 −1に相当します。

#include <stdio.h>
typedef unsigned int uint32;

int main()
{
     uint32 i;
     int x = -1;
     i = x%32;
     printf("\n\n Value of uint32 i = %d", i);
     return (0);
}

出力:

Value of uint32 i = -1

以下は、私が解釈できないcpp標準で見つけた説明です。

符号付き整数型ごとに、対応する(ただし異なる)符号なし整数型が存在します。「unsignedchar」、「unsigned short int」、「unsigned int」、および「unsigned long int」で、それぞれが同じ量を占めます。ストレージの容量であり、対応する符号付き整数タイプと同じアライメント要件(3.9)があります40)。つまり、各符号付き整数型は、対応する符号なし整数型と同じオブジェクト表現を持ちます。符号付き整数型の非負値の範囲は、対応する符号なし整数型のサブ範囲であり、対応する各符号付き/符号なし型の値表現は同じでなければなりません。

4符号なしと宣言された符号なし整数は、2nを法とする算術の法則に従うものとします。ここで、nは、その特定のサイズの整数の値表現のビット数です。

40)タイプとそれらを指定するタイプ指定子のシーケンスとの間の対応については、7.1.5.2を参照してください。

41)これは、結果の符号なし整数型で表現できない結果が、結果の符号なし整数型で表現できる最大値より1大きい数を法として減少するため、符号なし算術がオーバーフローしないことを意味します。

4

2 に答える 2

17

に間違ったフラグを使用していprintfます。する必要があります%u

printf("\n\n Value of uint32 i = %u", i);

于 2012-06-27T10:34:07.020 に答える
7

同じビットパターンは、さまざまな方法で解釈できます。符号付き整数と符号なし整数の唯一の違いは、ビットパターンの解釈方法にあります。コードprintfは、unsigned intをsignedとして解釈するように指示しているため、負の数が表示されます。

実験の問題として、これを試してください:

printf("%u\n", -1);

これにより、大きな正の数が生成されます。これは、投稿で説明した状況とは正反対の状況です。繰り返しにprintfなりますが、符号付き数値を符号なしとして解釈するように求められるため、符号を破棄し、値を符号なしであるかのように出力します。

于 2012-06-27T10:35:14.747 に答える