10

Cのデータ型を把握するのに苦労しています。Cの本を読んでいますが、課題の1つは、ashortが格納できる最大数と最小数を尋ねています。

を使用sizeof(short);すると、shortが2バイトを消費することがわかります。つまり、16ビットです。これは、数値の2進表現を格納するのに8ビットかかるため、2つの数値を意味します。たとえば、9は001110011ビットを埋めます。では、符号なしの場合は0から99で、符号付きの場合は-9から9ではないでしょうか。

私が間違っていることは知っていますが、理由はわかりません。ここでの最大値は、署名付きの場合は(-)32,767、署名なしの場合は65,535です。

短整数、2バイト、16ビット、-32,768-> +32,767範囲(16kb)

4

5 に答える 5

18

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

2進数は、10進数に似ていますが、数字は、、、、、、...、の代わりにとのみ0にすることができます。101239

このような番号がある場合:

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バイトの数値では、この範囲はからから65535になります00000000 0000000011111111 11111111

「数値の2進表現を格納するのに8ビットかかる」という記述は、「数値の10進表現を格納するのに8桁かかる」と言っているようなものですが、これは正しくありません。たとえば、番号12345678901234567890は8桁を超えています。同様に、すべての数値を8ビットに収めることはできませんが、256個だけに収めることができます。そのため、2バイト(short)、4バイト(int)、および8バイト(long long)の数値が得られます。実際、さらに広い範囲の数値が必要な場合は、ライブラリを使用する必要があります。

負の数に関する限り、2の補数のコンピューターでは、範囲の上位半分を負の値として使用するための慣例にすぎません。これは1、左側にが付いている数値が負であると見なされることを意味します。

それにもかかわらず、これらの数値は、数値が実際に示唆しているように、256を法として(ビットの場合はモジュロ)正の値と合同です。たとえば、符号なしの場合、および符号付きの場合、 256を法として合同である数値は255です。2^nn11111111-1

于 2012-07-29T17:32:47.810 に答える
11

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

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

于 2012-07-29T17:30:46.497 に答える
9

これは、で定義され<limits.h>SHRT_MINSHRT_MAXです。

于 2012-07-29T17:30:45.653 に答える
3

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

ショートは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進表現の規則は、ここで詳しく説明されています

それが役に立てば幸い!

于 2012-07-29T17:48:07.683 に答える
1

符号なし2進数で表される数値の範囲を見つける式:

2 ^ (sizeof(type)*8)
于 2012-07-29T17:32:19.267 に答える