15

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

4

5 回答 5

18

您陷入了二进制补码的想法 - C++ 标准没有定义用于负数的表示!

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

但是,在现实世界中,您不太可能遇到补码计算机

于 2008-11-04T20:52:49.180 回答
4

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

于 2008-11-05T00:38:23.937 回答
2

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

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

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

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

于 2008-11-05T19:57:21.820 回答
1

C 和 C++ 中的字符类型

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

于 2008-11-04T21:06:01.633 回答
0

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

这是我目前的理解:

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

于 2008-11-04T22:49:42.907 回答