web-dev-qa-db-ja.com

Cのunsigned intとsigned intの違いは何ですか?

これらの定義を考慮してください。

int x=5;
int y=-5;
unsigned int z=5;

それらはどのようにメモリに保存されますか?誰かがメモリ内のこれらのビット表現を説明できますか?

できる int x=5およびint y=-5メモリ内に同じビット表現がありますか?

32
Anand Kumar

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 |
    +---------------------+---------------------+---------------------+
  • 2の補数では、すべてのビットを反転してから1を加算することにより、負の数を取得します。
  • 1の補数では、すべてのビットを反転することにより、負の数を取得します。
  • 符号/大きさでは、最上位ビットが符号であるため、これを反転させるだけで負になります。

正の値はすべての表現で同じエンコードを持ち、負の値のみが異なることに注意してください。

さらに、符号なしの値については、符号にビットの1つを使用する必要がないことに注意してください。つまり、プラス側の範囲を広げることができます(もちろん、マイナスのエンコーディングは不要です)。

いいえ、5および-5は、使用する表現に関係なく、同じエンコーディングを持つことはできません。そうでなければ、違いを伝える方法はありません。

43
paxdiablo

C standard は、符号なしの数値がバイナリで保存されることを指定します。 (オプションのパディングビットを使用)。符号付きの数値は、次の3つの形式のいずれかで保存できます。 2の補数または1の補数。興味深いことに、これは Excess-nまたはBase −2 のような特定の他の表現を除外します。

ただし、ほとんどのマシンおよびコンパイラでは、符号付き数値を2の補数で保存します。

intは通常16または32ビットです。標準では、intは、>= shortおよび<= longその後、標準で許可されます。

ただし、一部のマシンおよびOSの履歴では、intが現在のハードウェアの反復に最適なサイズではありません。

4
Douglas Leeder

それはすべてメモリであるため、最終的にはすべての数値がバイナリで保存されます。

32ビットの符号なし整数には、すべてのバイナリ0からすべてのバイナリ1までの値を含めることができます。

32ビット符号付き整数になると、そのビット(最上位)の1つがフラグであり、値が正または負であることを示します。

3
Prashant

Cでの符号付きおよび符号なしINTのストレージを説明する非常に素晴らしいリンクがあります-

http://answers.yahoo.com/question/index?qid=20090516032239AAzcX1O

上記の記事から取られた-

「2の補数と呼ばれるプロセスを使用して、正の数を負の数に変換します。これの副作用は、最上位ビットを使用して、数が正か負かをコンピューターに通知することです。数値は負です。0の場合、数値は正です。」

3
Sachin Shanbhag

Intが16ビット整数であると仮定すると(これはCの実装に依存し、現在はほとんどが32ビットです)、ビット表現は次のように異なります。

 5 = 0000000000000101
-5 = 1111111111111011

バイナリ1111111111111011が符号なし整数に設定される場合、10進数の65531になります。

0
elsni