これらの定義を考慮してください。
int x=5;
int y=-5;
unsigned int z=5;
それらはどのようにメモリに保存されますか?誰かがメモリ内のこれらのビット表現を説明できますか?
できる int x=5
およびint y=-5
メモリ内に同じビット表現がありますか?
ISO Cは、その違いを示しています。
int
データ型は符号付きで、少なくとも-32767から32767までの最小範囲があります。実際の値はlimits.h
as INT_MIN
およびINT_MAX
それぞれ。
unsigned int
の最小範囲は0〜65535で、実際の最大値はUINT_MAX
同じヘッダーファイルから。
それを超えて、標準は値をエンコードするための2の補数表記を強制していません。それは可能性の1つにすぎません。許可されている3つのタイプには、5および-5(16ビットデータタイプを使用)に対して次のエンコーディングがあります。
two's complement | ones' complement | sign/magnitude
+---------------------+---------------------+---------------------+
5 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101 |
-5 | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101 |
+---------------------+---------------------+---------------------+
正の値はすべての表現で同じエンコードを持ち、負の値のみが異なることに注意してください。
さらに、符号なしの値については、符号にビットの1つを使用する必要がないことに注意してください。つまり、プラス側の範囲を広げることができます(もちろん、マイナスのエンコーディングは不要です)。
いいえ、5
および-5
は、使用する表現に関係なく、同じエンコーディングを持つことはできません。そうでなければ、違いを伝える方法はありません。
C standard は、符号なしの数値がバイナリで保存されることを指定します。 (オプションのパディングビットを使用)。符号付きの数値は、次の3つの形式のいずれかで保存できます。 2の補数または1の補数。興味深いことに、これは Excess-nまたはBase −2 のような特定の他の表現を除外します。
ただし、ほとんどのマシンおよびコンパイラでは、符号付き数値を2の補数で保存します。
int
は通常16または32ビットです。標準では、int
は、>= short
および<= long
その後、標準で許可されます。
ただし、一部のマシンおよびOSの履歴では、int
が現在のハードウェアの反復に最適なサイズではありません。
それはすべてメモリであるため、最終的にはすべての数値がバイナリで保存されます。
32ビットの符号なし整数には、すべてのバイナリ0からすべてのバイナリ1までの値を含めることができます。
32ビット符号付き整数になると、そのビット(最上位)の1つがフラグであり、値が正または負であることを示します。
Cでの符号付きおよび符号なしINTのストレージを説明する非常に素晴らしいリンクがあります-
http://answers.yahoo.com/question/index?qid=20090516032239AAzcX1O
上記の記事から取られた-
「2の補数と呼ばれるプロセスを使用して、正の数を負の数に変換します。これの副作用は、最上位ビットを使用して、数が正か負かをコンピューターに通知することです。数値は負です。0の場合、数値は正です。」
Intが16ビット整数であると仮定すると(これはCの実装に依存し、現在はほとんどが32ビットです)、ビット表現は次のように異なります。
5 = 0000000000000101
-5 = 1111111111111011
バイナリ1111111111111011が符号なし整数に設定される場合、10進数の65531になります。