C 16位数据类型范围中的混淆

C 16位数据类型范围中的混淆,c,char,int,range,primitive,C,Char,Int,Range,Primitive,在16位C编译器中,我们有2个字节存储整数,1个字节存储字符。对于无符号整数,范围为0到65535。对于有符号整数,范围为-32768到32767。对于无符号字符,0到255。根据整数类型,有符号字符的范围不应该是-128到127。但为什么是-127比127?剩下的一点呢?我想你把两件事混在一起了: 标准对签名字符、int等要求的范围是什么 现在大多数硬件都实现了哪些范围 只要所实现的范围是标准要求的范围的超集,这些值就不必相同 根据,实施定义的SCHAR_MIN和SCHAR_MAX值的大小(绝

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

我想你把两件事混在一起了:

  • 标准
    签名字符
    int
    等要求的范围是什么
  • 现在大多数硬件都实现了哪些范围
  • 只要所实现的范围是标准要求的范围的超集,这些值就不必相同

    根据,实施定义的
    SCHAR_MIN
    SCHAR_MAX
    值的大小(绝对值)应等于或大于,且符号与:

    SCHAR_MIN  -127
    SCHAR_MAX  +127
    
    i、 e.只有255个值,而不是256个值

    但是,合规实现定义的限制在数量上可能比这些限制“更大”。i、 e.
    [-128,+127]
    也是标准允许的。由于大多数机器都表示数字,所以您最常看到的范围是
    [-128,+127]

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

    INT_MIN    -32767
    INT_MAX    +32767
    
    i、 e.只有65535个值,而不是65536个值

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

    在这种情况下,可以用8位表示256个有符号值(即
    [-128,+127]
    ),但在其他有符号数字表示中,这是不可能的

    在中,为符号保留一位,因此:

    00000000
    10000000
    
    两者的意思相同,即
    0
    (或者更确切地说,
    +0
    -0

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

    在中(通过按位NOT进行求反):

    两者的含义相同,即
    0

    同样,只有-127(
    10000000
    )到+127(
    01111111
    )之间的值可以用8位表示


    如果C标准要求范围为
    [-128,+127]
    ,那么这将从本质上排除使用这种表示的机器能够高效地运行C程序。它们需要一个额外的位来表示这个范围,因此需要9位来存储有符号字符,而不是8位。基于以上的逻辑结论是:这就是为什么C标准要求签名字符使用
    [-127,+127]
    。i、 e.允许实现自由选择适合其需要的整数表示形式,同时能够以有效的方式遵守标准。同样的逻辑也适用于<代码> INT/COM>。

    顺便说一下,今年CPCPon的一位发言人(我忘了其中的一个)说他们正在写一篇关于C++对符号整数的两个补码标准化的论文。
    00000000
    11111111