短类型可以在C中存储的最大和最小数量是多少?

Moh*_*mad 9 c memory types short

我很难在C中掌握数据类型.我正在阅读一本C书,其中一个挑战是询问short可以存储的最大和最小数字.

使用sizeof(short);我可以看到短消耗2个字节.这意味着它是16位,这意味着两个数字,因为它需要8位来存储数字的二进制表示.例如,9将00111001填满一位.因此,对于无符号,并且-9到9签名,它不会是0到99吗?

我知道我错了,但我不确定为什么.它在这里说最大值是( - )32,767用于签名,65,535用于无符号.

short int,2 Bytes,16 Bits,-32,768 - > +32,767 Range(16kb)

Sha*_*baz 16

用十进制思考一秒钟.如果你有2只为一些数字,这意味着你可以从存储0099其中.如果你有4个数字,该范围变得00009999.

二进制数的类似小数点,除了数字只能是01,而不是0,1,2,3,..., 9.

如果您有这样的数字:

01011101
Run Code Online (Sandbox Code Playgroud)

这是:

0*128 + 1*64 + 0*32 + 1*16 + 1*8 + 1*4 + 0*2 + 1*1 = 93
Run Code Online (Sandbox Code Playgroud)

如您所见,您可以存储比9一个字节更大的值.在无符号的8位数字中,您实际上可以存储来自00000000to的值11111111,即十进制的255.

在一个2字节数,这个范围从变00000000 0000000011111111 11111111这恰好是65535.

你的陈述"它需要8位来存储数字的二进制表示"就像说"它需要8位数来存储数字的十进制表示",这是不正确的.例如,编号12345678901234567890的数字超过8位.同样,您不能将所有数字都装入8位,而只能装入其中的256位.这就是你得到2字节(short),4字节(int)和8字节(long long)数字的原因.事实上,如果您需要更高范围的数字,则需要使用库.

只要涉及负数,在二进制补码计算机中,它们只是使用该范围的较高一半作为负值的惯例.这意味着1左侧有a的数字被认为是负数.

然而,这些数字是相同的模256(模数,2^n如果n位)到它们的正值,正如数字所暗示的那样.例如,11111111如果是无符号,则数字为255;如果是有符号的则为256,则为数字-1.


Kei*_*all 8

您阅读的参考文献是正确的.至少,对于通常的C实现,其中short16位 - 实际上并没有在标准中修复.

16位可以容纳2 ^ 16个可能的位模式,即65536种可能性.签名短路为-32768至32767,无符号短路为0至65535.


Ric*_*III 7

这被定义在<limits.h>,并且是SHRT_MINSHRT_MAX.

  • OP明显存在理解二进制数的问题._this_如何帮助他理解? (3认同)
  • @Shahbaz:这不会让他理解,但它确实给了他一些简单的十进制数字。在编写可移植程序时,`&lt;limits.h&gt;` 也可以是一个非常有价值的工具,谁知道这是否是问题的核心问题?这个问题的答案在理论和实践之间取得了恰到好处的平衡。 (2认同)