为什么C和C ++中的signed char范围不同?

时间:2016-09-20 20:21:13

标签: c c++11

为什么{C}和C ++中signed char的范围不同?   在C中,范围是-128 t0 127,在C ++中,它是`-127到127',但另一方面,无符号范围是相同的。为什么?

3 个答案:

答案 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} }