我正在阅读《C++程序设计语言》这本书,Stroustrup 在里面提到 char 类型的 int 值可以从 0 到 255 或从 -127 到 127 取值,这是正确的吗?看起来应该是从-128到127才对。如果不是这样,为什么第二种实现只有 255 种可能的值,而不是256种?
我正在阅读《C++程序设计语言》这本书,Stroustrup 在里面提到 char 类型的 int 值可以从 0 到 255 或从 -127 到 127 取值,这是正确的吗?看起来应该是从-128到127才对。如果不是这样,为什么第二种实现只有 255 种可能的值,而不是256种?
你被困在二进制补码思维中了 - C++标准并未定义用于负数的表示方法!
如果你的计算机(天啊)使用一进制补码来表示负数,在8位字节中你将有一个范围为-127到+ 127。好处是,你有两种不同的零的表示方式...
然而,在现实世界中,你不太可能遇到一进制补码的计算机。
错误地认为无符号字符的取值范围是0到255是不正确的。那只是其最小范围。一个char必须至少有8位,而signed char、unsigned char和char本身确实可以有超过8位的位数。因此,这意味着无符号字符的取值范围可能会超过255。尽管我没有实现超过8位的情况,但在c89标准(c++03基于此)的limits.h文件中有相关规定(CHAR_BIT,UCHAR_MAX,CHAR_MAX)。
由于标准没有对char类型做出明确的规定,"char" 可能是:
在某些编译器上(例如:德州仪器的ARM处理器-OMAP系列),"unsigned char"(0-255)
在大多数编译器上(如gcc、MSVC等),"signed char"(-128-127)
为了确保总有一个明确定义的范围,您应该使用 "signed char" 或 "unsigned char"。
我目前的理解是有三种可能性:
如果值表示为无符号,那么char的范围将从0到255。
如果值以二进制补码表示为有符号数,则char的范围为-128至127。
最后,如果值以一的补码表示为有符号数,则char的范围为-127至127。
这最后一种可能性表明,与前两种实现相比,只有255个可能的值,但这未考虑一的补码表示中的负零。