0

ここに MSDN リンクがありますhttp://msdn.microsoft.com/en-us/library/s3f49ktz(v=VS.80).aspxから

unsigned int : 4byte 値の範囲 0 ~4,294,967,295

したがって、私のテストコード:

void main(void) 
{       
    unsigned int sum;   //4byte, 32bit
    sum = 2147483648;  //2^31 represent by 1 followed by 31 0s
    printf("sum is %d\n",sum); 
    sum = sum -1 ;     //2^31-1 represent by 0 followed by 31 1s
    printf("sum is %d\n",sum);
    getchar();
} 

確かに 4,294,967,295=2^32-1, printfは "0" を出力し、最上位ビットをダンプ します。

4

3 に答える 3

6

ドキュメントは正しいです。

-2147483648 ~ 2147483647 (2 31 - 1) は、signed int の範囲です。

0 ~ 4294967295 (2 32 - 1) はunsigned int の範囲です。

%uの代わりに使用%d

printf("sum is %u\n",sum);

printf 型フィールド文字を参照してください

于 2011-08-06T06:41:36.460 に答える
2

それは間違っています。4b を取得したい場合は、そうする必要があります。

unsigned int sum;
sum = 0;
sum -= 1;

あるいは

unsigned int sum = -1; // will give the same result

これにより、unsigned int の正しい最大値が得られるはずです (ハックっぽい)。また、他の人が指摘したように、値が正しく解釈されるように、%u を printf のフォーマッタとして使用する必要があります。

unsigned int はすべてのビットをマグニチュード ビットとして使用するため、先頭のビットは符号ビットと見なされなくなり、2^31 - 1 ではなく 2^32 - 1 になります。

于 2011-08-06T06:42:45.283 に答える
0

Sanderが述べたように、符号付きではなく符号なし整数を見ているので、%u代わりに使用する必要があります。%d

負の数は2 の補数を使用して格納されます。ここで、-1 = 0xFFFFFFFF、-2 = 0xFFFFFFFE、というように -2^32 = 0x80000000 になります。

unsigned int に対して 0xFFFFFFFF + 1 を実行すると、オーバーフロー (余分なビットのダンプ) が発生し、結果として変数が 0 になります。

于 2011-08-06T06:53:54.813 に答える