Cでデータ型を把握するのに苦労しています。Cブックを調べています。課題の1つは、short
に格納できる最大数と最小数を尋ねます。
sizeof(short);
を使用すると、shortが2バイトを消費することがわかります。これは、16ビットであることを意味します。これは、数値のバイナリ表現を格納するのに8ビットかかるため、2つの数値を意味します。たとえば、9は00111001
は、1ビットを埋めます。それでは、署名なしの場合は0〜99、署名なしの場合は-9〜9ではありませんか。
私は間違っていることを知っていますが、理由はわかりません。 here の最大値は、(-)32,767が署名済み、65,535が未署名です。
short int、2バイト、16ビット、-32,768-> +32,767範囲(16kb)
10進数で1秒考えてください。数字が2桁しかない場合は、00
から99
までの数字を格納できます。 4桁の場合、その範囲は0000
から9999
になります。
2進数は10進数に似ていますが、0
、1
、0
、1
、...、2
の代わりに、3
と9
のみを使用できます。
このような数がある場合:
01011101
これは:
0*128 + 1*64 + 0*32 + 1*16 + 1*8 + 1*4 + 0*2 + 1*1 = 93
ご覧のとおり、9
より大きな値を1バイトで格納できます。符号なし8ビットの数値では、実際には00000000
から11111111
までの値を格納できます。これは10進数で255です。
2バイトの数値では、この範囲は00000000 00000000
から11111111 11111111
になり、たまたま65535になります。
「数値の2進数表現を格納するには8ビットが必要です」という文は、「数値の10進数表現を格納するには8桁が必要です」と言っているようなもので、正しくありません。たとえば、12345678901234567890の数字は8桁を超えています。同様に、すべての数値を8ビットに適合させることはできませんが、256個のみです。そのため、2バイト(short
)、4バイト(int
)、8バイト(long long
)の数値を取得します。実際、さらに大きな範囲の数値が必要な場合は、ライブラリを使用する必要があります。
負の数に関する限り、2の補数のコンピューターでは、範囲の上位半分を負の値として使用するための慣例にすぎません。つまり、左側に1
がある数字は負と見なされます。
それにもかかわらず、これらの数値は 合同 256を法として(n
ビットの場合は2^n
を法として)、数値が実際に示すように正の値になります。たとえば、数値11111111
は、符号なしの場合は255、符号付きの場合は256を法として合同である-1
です。
あなたが読んだ参照は正しいです。少なくとも、short
が16ビットである通常のC実装では、実際には標準で修正されていません。
16ビットは2 ^ 16の可能なビットパターンを保持できます。これは65536の可能性です。符号付きショートは-32768〜32767、符号なしショートは0〜65535です。
これは <limits.h>
、そしてSHRT_MIN
&SHRT_MAX
。
他のものはあなたのためにかなり良い解決策を投稿しました、しかし私は彼らがあなたの考えに従って、あなたがどこが間違っていたか説明したとは思いません。試してみます。
ショートは2バイトを消費することがわかります。つまり、16ビットです。
この時点までは正しいです(ただし、short
は4バイトであることが保証されていないように、int
は2バイト長であることが保証されていません—標準で保証されている唯一のサイズ(正しく覚えている場合)はchar
は常に1バイト幅でなければなりません)。
これは、数値のバイナリ表現を格納するために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進数で表された数値の範囲を求める式:
2 ^ (sizeof(type)*8)