一个字符的整数值范围是否取决于实现?

15

我正在阅读《C++程序设计语言》这本书,Stroustrup 在里面提到 char 类型的 int 值可以从 0 到 255 或从 -127 到 127 取值,这是正确的吗?看起来应该是从-128到127才对。如果不是这样,为什么第二种实现只有 255 种可能的值,而不是256种?


你有没有想过为什么整数的范围是从-128到127而不是从-127到128? - user1437027
自从采用了P1236r1,C++20中的有符号数是二进制补码。请参见https://dev59.com/nnENtIcB2Jgan1zn6ks7 。因此,字符通常从-128..127或0..255。请参见https://en.cppreference.com/w/cpp/language/types 。该页面还指出,自C++11以来,8位一补码字符间接被禁止以支持UTF-8 0x80。字符的宽度在8到64位之间。 - Sebastian
5个回答

18

6

错误地认为无符号字符的取值范围是0到255是不正确的。那只是其最小范围。一个char必须至少有8位,而signed char、unsigned char和char本身确实可以有超过8位的位数。因此,这意味着无符号字符的取值范围可能会超过255。尽管我没有实现超过8位的情况,但在c89标准(c++03基于此)的limits.h文件中有相关规定(CHAR_BIT,UCHAR_MAX,CHAR_MAX)。


1
这是真的。我曾经使用过嵌入式DSP处理器,其中char、short、int和long都是32位。 - ChrisN

3

由于标准没有对char类型做出明确的规定,"char" 可能是:

  1. 在某些编译器上(例如:德州仪器的ARM处理器-OMAP系列),"unsigned char"(0-255)

  2. 在大多数编译器上(如gcc、MSVC等),"signed char"(-128-127)

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


1

0

我目前的理解是有三种可能性:

  • 如果值表示为无符号,那么char的范围将从0到255。

  • 如果值以二进制补码表示为有符号数,则char的范围为-128至127。

  • 最后,如果值以一的补码表示为有符号数,则char的范围为-127至127。

这最后一种可能性表明,与前两种实现相比,只有255个可能的值,但这未考虑一的补码表示中的负零。


几乎:unsigned 的范围是从0到255,而不是256。我从未在1的补码机器上工作过,所以+0和-0的工作方式是一个猜测。从C的角度来看,我希望你永远无法分辨出它们之间的区别。 - Roddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接