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大きい数を法として減少するため、符号なし算術がオーバーフローしないことを意味します。