【问题标题】:Why is the range of signed char is different in C and C++? [closed]为什么有符号字符的范围在 C 和 C++ 中不同? [关闭]
【发布时间】:2016-09-20 20:21:12
【问题描述】:

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

【问题讨论】:

  • 谁告诉你的?因为对他们说这个……“不。”
  • 我已经检查过了,然后我问了这个问题。 @simrandhamija
  • @DeveshPratapSingh:这不是 C++ 标准,所以无论它说什么都没有绑定到 C++ 语言是什么。由于您提出了不正确的假设,没有引用任何来源,然后问为什么这些假设是这样的,因此投票决定关闭。

标签: c c++11


【解决方案1】:

你错了。在两种语言中,signed char 的 保证 最小值实际上是 -127。引自 C11 标准(草案N1570):

  • signed char 类型对象的最小值

      SCHAR_MIN                                -127
    

请注意,实际的绝对最小值是实现定义的,并且可能更大:

...它们的实现定义值的大小(绝对值)应等于或大于所示值,符号相同。

在具有 8 位字节和二进制补码表示的处理器上(这很常见),在 C 和 C++ 中,最小值几乎肯定是 -128。之所以只保证 -127,是因为它允许支持非二进制补码表示。

【讨论】:

    【解决方案2】:

    cmets 中引用的文本是指c++ 标准没有指导如何实现带符号字符的事实,即。它可以实现为 1 的补码,为您提供值 -127 -> 127(带有 +0 和 -0)。

    8 位字节表示的 256 个值可以解释为值 0 到 255 或值 -127 到 127 。不,不是人们可能期望的 -128 到 127:c++ 标准保留了硬件兼容的可能性并消除了一个值,因此 -128 的使用是不可移植的。

    它没有说一个字符是 -127 -> 127,它说它可能是。是的,如果您希望每个符合标准的系统都具有可移植性,您需要考虑使用 1 的补码实现 char 的可能性。实际上,从来没有人拥有过这个......

    你应该更担心一些硬件如何实现 16 位字符......

    【讨论】:

    • 感谢您的宝贵时间!最后一行的答案是 .
    【解决方案3】:

    我不是专家,但我找不到 c++ 范围为 -127 到 127 的参考。我看到的所有内容都说它也是 -128 到 127。参考:https://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.80).aspx

    【讨论】:

    • 这里出现文本 - “由 8 位字节表示的 256 个值可以解释为值 0 到 255 或值 -127 到 127。不,不是 -128 到127 正如人们所期望的那样“。这是写在这里的,你可以自己检查。我已经提到了上面的部分和小节。
    • -127 到 127 是必需的最小范围。允许范围更广。
    • 对不起,-1。您通常无法通过链接到特定编译器的文档来回答 C++ 语言问题。我的编译器签名的 char 的范围是 -127 到 127,这是完全合法的 C++。
    • @GManNickG:是的,这是完全合法的——但令人惊讶。哪个编译器使用该范围?假设一个 2 的补码表示,如果你这样做 signed char sc = -127; --sc; std::cout << "sc = " << (int)sc << "\n"; 会发生什么? (我知道行为未定义。)
    • @KeithThompson:...我承认,这是我的大脑编译器。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    相关资源
    最近更新 更多