我正在阅读 C ++编程语言,其中Stroustrup声明char的int值可以在0到255或-127到127之间,具体取决于实现。它是否正确?它似乎应该是从-128到127.如果不是,为什么在第二种实现可能性中它们只有255个可能值,而不是256.
答案 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)
从阅读中可以看出它可能是其中任何一种,具体取决于实施。
答案 3 :(得分:1)
因为标准没有说明关于char类型的任何内容,所以“char”可以是:
“unsigned char”(0-255)(例如:针对ARM处理器的TexasInstruments编译器--OMAP系列)
“signed char”( - 128-127)(gcc,MSVC ......)
为了确保您总是有一个明确定义的范围,您应该使用“signed char”或“unsigned char”。
答案 4 :(得分:0)
感谢Roddy和Esteban Brenes的回复。
这是我目前的理解:
有三种可能性。如果值表示为无符号,则char的范围为0到255.如果值以二进制补码表示,则char的范围为-128到127.最后,如果值表示为带符号的补码一个char的范围是-127到127.最后的可能性表明,与前两个实现的256个可能值相比,只有255个可能的值,但是这没有考虑到一个补码表示中的负零。