41

次の定義を考慮してください。

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

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

メモリ内で同じビット表現を持つint x=5ことはできますか?int y=-5

4

5 に答える 5

49

ISO C には、違いが何であるかが記載されています。

データ型は符号付きで、int最小範囲は少なくとも -32767 ~ 32767 です。実際の値はそれぞれlimits.hasINT_MINとで与えられINT_MAXます。

Anunsigned 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する表現に関係なく、同じエンコーディングを持つことはできません。そうでないと見分けがつきません。


余談ですが、現在、C および C++ 標準の両方で、負の整数の唯一のエンコーディングとして 2 の補数を指定する動きが進行中です。

于 2010-09-28T11:16:10.150 に答える
4

C 標準では、符号なしの数値は 2 進数で格納されると規定されています。(オプションのパディング ビットを使用)。符号付き数値は、大きさと符号の 3 つの形式のいずれかで格納できます。2 の補数または 1 の補数。興味深いことに、それはExcess-n や Base −2 のような特定の他の表現を除外します。

ただし、ほとんどのマシンとコンパイラでは、符号付き数値は 2 の補数で格納されます。

int通常は 16 ビットまたは 32 ビットです。標準 では、それが標準で許可されているint限り、基礎となるプロセッサにとって最も効率的なものであるべきだと述べています。>= short<= long

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

于 2010-09-28T11:11:00.240 に答える
3

これは、Cでの署名付きおよび未署名のINTの保存について説明する非常に優れたリンクです-

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

この上記の記事から取得-

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

于 2010-09-28T11:03:45.853 に答える
0

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

 5 = 0000000000000101
-5 = 1111111111111011

2 進数の 1111111111111011 が unsigned int に設定される場合、10 進数の 65531 になります。

于 2010-09-28T11:05:44.080 に答える