16位数据类型范围内的混淆

时间:2012-07-27 06:50:16

标签: c char int range primitive

在16位C编译器中,我们有2个字节来存储整数,1个字节用于存储一个字符。对于无符号整数,范围是0到65535.对于有符号整数,范围是-32768到32767.对于无符号字符,0到255.根据整数类型,有符号字符范围不应该像-128到127.但是为什么-127到127?剩下的一点怎么样?

1 个答案:

答案 0 :(得分:18)

我认为你混合了两件事:

  1. 标准signed charint等所需的范围
  2. 这些天在大多数硬件中实施的范围。
  3. 只要实施的范围是标准所要求的范围的超集,它们就不一定必须相同。

    根据the C standardSCHAR_MINSCHAR_MAX 的实现定义值的大小(绝对值)等于或大于同样的标志:

    SCHAR_MIN  -127
    SCHAR_MAX  +127
    

    即。 只有255个值,不是256

    但是,合规实施所定义的限制可能比这些限制“更大”。即标准也允许[-128,+127]。由于大多数机器代表2's complement form中的数字,[-128,+127]是您最常见到的范围。

    实际上,甚至 C标准定义的int的最小范围对称大约为零。它是:

    INT_MIN    -32767
    INT_MAX    +32767
    

    即。 仅65535个值,不是65536

    但同样,大多数机器使用2's complement表示,这意味着它们提供范围[-32768,+32767]

    虽然在2's complement form中可以用8位(即[-128,+127])表示256个有符号值,但还有其他有符号数字表示,这是不可能的。

    sign-magnitude representation中,为符号保留一位,所以:

    00000000
    10000000
    

    两者意思相同,即0(或更确切地说,+0-0)。

    这意味着浪费了一个值。因此,符号幅度表示只能在8位中保存-127(11111111)到+127(01111111)的值。

    one's complement representation中(通过按位NOT否定):

    00000000
    11111111
    

    两者意思相同,即0

    同样,只有-127(10000000)到+127(01111111)的值才能用8位表示。

    如果C标准要求范围为[-128,+127],那么这将基本上排除使用此类表示的计算机能够有效地运行C程序。它们需要一个额外的位来表示这个范围,因此需要9位来存储有符号的字符而不是8个。基于上述的逻辑结论是:这就是C标准对有符号字符需要[-127,+127]的原因。即允许实现自由选择适合其需要的整数表示形式,同时能够以有效的方式遵守标准。同样的逻辑同样适用于int

相关问题