他の人はあなたのためにかなり良い解決策を投稿しました、しかし私は彼らがあなたの考えに従いそしてあなたが間違っていたところを説明したとは思いません。試してみます。
ショートは2バイトを消費することがわかります。つまり、16ビットです。
この時点までは正しいです(ただし、 4であることが保証されていないshort
ように、2バイトの長さであるint
とは保証されていません。標準で保証されている唯一のサイズ(私が正しく覚えている場合)はchar
、常に1バイト幅である必要があります)。
これは、数値の2進表現を格納するのに8ビットかかるため、2つの数値を意味します。
ここから少しドリフトし始めました。数値を格納するのに実際には8ビットはかかりません。数値によっては、格納に16、32、64、またはそれ以上のビットが必要になる場合があります。16ビットを2に分割するのは間違っています。CPU実装の詳細がなければ、たとえば2ビットの数値があった可能性があります。その場合、これらの2ビットは次のような値を格納できます。
00 - 0 in decimal
01 - 1 in decimal
10 - 2 in decimal
11 - 3 in decimal
4を格納するには、3ビットが必要です。そのため、値が「適合しない」ため、オーバーフローが発生します。同じことが16ビット数にも当てはまります。たとえば、16ビットで格納された10進数の符号なし「255」がある場合、バイナリ表現はになります0000000011111111
。その数に1を加えると、0000000100000000
(10進数で256)になります。したがって、8ビットしかない場合は、最上位ビットが破棄されるため、オーバーフローして0になります。
これで、16ビットメモリで使用できる符号なしの最大数は—1111111111111111
で、10進数で65535になります。つまり、符号なしの数値の場合、すべてのビットを1に設定すると、可能な最大値が得られます。
ただし、符号付き数値の場合、最上位ビットは符号を表します。正の場合は0、負の場合は1です。負の場合、最大値は1000000000000000
で、基数10では-32678です。符号付き2進表現の規則は、ここで詳しく説明されています。
それが役に立てば幸い!