次の定義を考慮してください。
int x=5;
int y=-5;
unsigned int z=5;
それらはどのようにメモリに保存されますか?メモリ内のこれらのビット表現を説明できる人はいますか?
メモリ内で同じビット表現を持つint x=5
ことはできますか?int y=-5
次の定義を考慮してください。
int x=5;
int y=-5;
unsigned int z=5;
それらはどのようにメモリに保存されますか?メモリ内のこれらのビット表現を説明できる人はいますか?
メモリ内で同じビット表現を持つint x=5
ことはできますか?int y=-5
ISO C には、違いが何であるかが記載されています。
データ型は符号付きで、int
最小範囲は少なくとも -32767 ~ 32767 です。実際の値はそれぞれlimits.h
asINT_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 |
+---------------------+---------------------+---------------------+
正の値はすべての表現で同じエンコーディングを持つことに注意してください。異なるのは負の値だけです。
さらに、符号なしの値の場合、ビットの 1 つを符号に使用する必要がないことに注意してください。つまり、プラス側でより多くの範囲を取得できることを意味します (もちろん、マイナスのエンコーディングがないという犠牲を払って)。
いいえ、5
使用-5
する表現に関係なく、同じエンコーディングを持つことはできません。そうでないと見分けがつきません。
余談ですが、現在、C および C++ 標準の両方で、負の整数の唯一のエンコーディングとして 2 の補数を指定する動きが進行中です。
C 標準では、符号なしの数値は 2 進数で格納されると規定されています。(オプションのパディング ビットを使用)。符号付き数値は、大きさと符号の 3 つの形式のいずれかで格納できます。2 の補数または 1 の補数。興味深いことに、それはExcess-n や Base −2 のような特定の他の表現を除外します。
ただし、ほとんどのマシンとコンパイラでは、符号付き数値は 2 の補数で格納されます。
int
通常は 16 ビットまたは 32 ビットです。標準 では、それが標準で許可されているint
限り、基礎となるプロセッサにとって最も効率的なものであるべきだと述べています。>= short
<= long
ただし、一部のマシンおよび OS では、履歴がint
現在のハードウェアの反復に最適なサイズではない原因があります。
これは、Cでの署名付きおよび未署名のINTの保存について説明する非常に優れたリンクです-
http://answers.yahoo.com/question/index?qid=20090516032239AAzcX1O
この上記の記事から取得-
「2 の補数と呼ばれるプロセスは、正の数を負の数に変換するために使用されます。これの副作用は、数値が正か負かをコンピューターに伝えるために最上位ビットが使用されることです。最上位ビットが 1 の場合、数値は負です。0 の場合、数値は正です。」
int が 16 ビットの整数であると仮定すると (これは C の実装に依存し、最近ではほとんどが 32 ビットです)、ビット表現は次のように異なります。
5 = 0000000000000101
-5 = 1111111111111011
2 進数の 1111111111111011 が unsigned int に設定される場合、10 進数の 65531 になります。