2

(unsigned)~0とはどう違いますか(unsigned)1?なぜunsignedofとof~0はなのです か? 符号なしの数値がメモリに格納される方法と関係がありますか。符号なしの数値で符号付きの結果が得られるのはなぜですか。オーバーフローエラーも発生しませんでした。私は コンパイラを使用しています:-1unsigned11GCC

#include<sdio.h>
main()
{
 unsigned int x=(unsigned)~0; 
 unsigned int y=(unsigned)1; 
 printf("%d\n",x); //prints -1
 printf("%d\n",y); //prints 1
}
4

4 に答える 4

1

まず、printf の使用では、番号を符号なし ("%u") ではなく符号付き ("%d") として出力するように指示しています。

第二に、「数値がメモリに格納される方法と関係がある」という点であなたは正しいです。int (符号付きまたは符号なし) は、コンピューター上の 1 ビットではなく、k ビットの集合です。k の正確な値は、コンピューター アーキテクチャの仕様によって異なりますが、ほとんどの場合、k=32 です。

簡潔にするために、int の長さが 8 ビット、つまり k=8 であると仮定します (非常に限定された組み込みシステムで作業している場合を除き、これはほとんど当てはまりません)。その場合、(int)0 は実際には 00000000 であり、(int)~0 (すべてのビットを否定する) は 11111111 です。

最後に、2 の補数 (符号付き数値の最も一般的な 2 進数表現) では、11111111 は実際には -1 です。2 の補数の説明については、 http://en.wikipedia.org/wiki/Two 's_complement を参照してください。

印刷を "%u" を使用するように変更すると、(2^k-1) を表す正の整数が印刷されます。ここで、k は整数のビット数です (したがって、おそらく 4294967295 が印刷されます)。

于 2013-09-30T01:38:09.460 に答える