【问题标题】:range for integer values of chars in c++c++中字符整数值的范围
【发布时间】:2010-09-20 18:33:15
【问题描述】:

我正在阅读C++ 编程语言,Stroustrup 在其中指出,char 的 int 值范围可以从 0 到 255 或 -127 到 127,具体取决于实现。它是否正确?看起来应该是从-128到127。如果不是,为什么在第二种实现可能性中它们只有255个可能的值,而不是256。

【问题讨论】:

  • 你知道为什么整数的范围是-128到127而不是-127到128吗??

标签: c++ language-implementation language-details


【解决方案1】:

你被困在two's complement 的思维中 - C++ 标准没有定义用于负数的表示!

如果您的计算机(上帝保佑)使用ones's complement 表示负数,那么您在 8 位字节中的范围为 -127 到 + 127。从好的方面来说,零有两种不同的可能表示形式......

然而,在现实世界中,you're unlikely to meet a one's complement computer

【讨论】:

    【解决方案2】:

    认为 unsigned char 的范围是 0 到 255 是错误的。这只是它的最小范围。一个 char 必须至少有 8 位,而有符号字符、无符号字符和 char 本身确实可以有更多的 8 位。所以这意味着 unsigned char 可以超过 255。虽然我承认,我没有一个超过 8 位的实现,但理论上是可能的。这是在 c89 标准(c++03 的基础)中指定的,记录文件 limits.h(CHAR_BIT、UCHAR_MAX、CHAR_MAX)。

    【讨论】:

    • 这是真的。我使用过 char、short、int 和 long 都是 32 位的嵌入式 DSP 处理器。
    【解决方案3】:

    由于标准没有说明 char 类型,“char”可以是:

    1. 某些编译器上的“unsigned char”(0-255)(例如:TexasInstruments 的 ARM 处理器编译器 - OMAP 系列)

    2. 大多数编译器(gcc、MSVC ...)上的“signed char”(-128-127)

    为确保您始终有一个明确定义的范围,您应该使用“signed char”或“unsigned char”。

    【讨论】:

      【解决方案4】:

      Character types in C and C++

      从阅读来看,它似乎可以是其中任何一个,具体取决于实现。

      【讨论】:

        【解决方案5】:

        感谢 Roddy 和 Esteban Brenes 的有用回复。

        这是我目前的理解:

        有三种可能。如果值表示为无符号,则 char 的范围为 0 到 255。如果值表示为带符号的二进制补码,则 char 的范围为 -128 到 127。最后,如果值表示为带符号的补码, char 的范围从 -127 到 127。最后的可能性表明,与前两个实现的 256 个可能值相比,只有 255 个可能值,但这没有考虑到补码表示中的负零.

        【讨论】:

        • 几乎:无符号从 0 到 255 而不是 256。我从来没有在 1 的补码机器上工作过,所以 +0 和 -0 的工作原理是一个猜测。我希望从 C 的角度来看,你永远无法区分
        猜你喜欢
        • 2015-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-08
        • 2014-07-24
        • 2013-12-04
        • 1970-01-01
        相关资源
        最近更新 更多