web-dev-qa-db-ja.com

ショートタイプがCに保存できる最大数と最小数は何ですか?

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)

9
Mohamad

10進数で1秒考えてください。数字が2桁しかない場合は、00から99までの数字を格納できます。 4桁の場合、その範囲は0000から9999になります。

2進数は10進数に似ていますが、0101、...、2の代わりに、39のみを使用できます。

このような数がある場合:

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です。

16
Shahbaz

あなたが読んだ参照は正しいです。少なくとも、shortが16ビットである通常のC実装では、実際には標準で修正されていません。

16ビットは2 ^ 16の可能なビットパターンを保持できます。これは65536の可能性です。符号付きショートは-32768〜32767、符号なしショートは0〜65535です。

8
Keith Randall

これは <limits.h> 、そしてSHRT_MINSHRT_MAX

7

他のものはあなたのためにかなり良い解決策を投稿しました、しかし私は彼らがあなたの考えに従って、あなたがどこが間違っていたか説明したとは思いません。試してみます。

ショートは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です。符号付きバイナリ表現の規則は、よく説明されています ここ

それが役に立てば幸い!

3
user405725

符号なしの2進数で表された数値の範囲を求める式:

2 ^ (sizeof(type)*8)
0
Linuxios