c ++中字符整数值的范围

时间:2008-11-04 20:47:17

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

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

5 个答案:

答案 0 :(得分:16)

你陷入two's complement思考 - C ++标准没有定义用于负数的表示形式!

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

Character types in C and C++

从阅读中可以看出它可能是其中任何一种,具体取决于实施。

答案 3 :(得分:1)

因为标准没有说明关于char类型的任何内容,所以“char”可以是:

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

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

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

答案 4 :(得分:0)

感谢Roddy和Esteban Brenes的回复。

这是我目前的理解:

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