为什么{C}和C ++中signed char
的范围不同?
在C中,范围是-128 t0 127
,在C ++中,它是`-127到127',但另一方面,无符号范围是相同的。为什么?
答案 0 :(得分:10)
你错了。在两种语言中,签名字符的保证最小值实际上是-127。引自C11标准(草案N1570):
signed char类型对象的最小值
SCHAR_MIN -127
请注意,实际的绝对最小值是实现定义的,可能更大:
......它们的实现定义值的大小(绝对值)应等于或大于显示的值,并带有相同的符号。
对于具有8位字节和2位补码表示的处理器(这是相当常见的),C和C ++中的最小值几乎肯定是-128。保证只有-127的原因是因为它允许支持非二进制补码表示。
答案 1 :(得分:5)
注释中引用的文本指的是c++
标准不指导如何实现signed char的事实,即。它可以实现为1的补码,为您提供值-127 - > 127(带+0和-0)。
由8位字节表示的256个值可以解释为值0到255或者值-127到127。不,不是-128到127正如人们所期望的那样:c ++标准留下了一些赞美硬件的可能性并消除了一个值,因此使用-128是不可移植的。
它没有说char是-127 - > 127,它说可能。是的,如果您希望在每个标准符合系统中都具有可移植性,则需要考虑char
的1补码实现的可能性。实际上,没有人有这个......
你应该更担心一些硬件如何实现16位字符......
答案 2 :(得分:-2)
我不是专家,但我找不到c ++范围-127到127的引用。我看到的一切都是-128到127.参考:{{3} }