C 16位数据类型范围中的混淆
在16位C编译器中,我们有2个字节存储整数,1个字节存储字符。对于无符号整数,范围为0到65535。对于有符号整数,范围为-32768到32767。对于无符号字符,0到255。根据整数类型,有符号字符的范围不应该是-128到127。但为什么是-127比127?剩下的一点呢?我想你把两件事混在一起了: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值的大小(绝
签名字符
、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