我正在阅读 C++ Primer 5th Edition,但我不明白以下部分:
在无符号类型中,所有位都表示值。例如,一个 8 位无符号字符可以保存从 0 到 255 的值(包括 0 到 255)。
“所有位代表值”是什么意思?
我正在阅读 C++ Primer 5th Edition,但我不明白以下部分:
在无符号类型中,所有位都表示值。例如,一个 8 位无符号字符可以保存从 0 到 255 的值(包括 0 到 255)。
“所有位代表值”是什么意思?
您应该将其与signed
类型进行比较。在一个signed
值中,一位(最高位)用于指示该值是正数还是负数,而其余位用于保存该值。
普通可复制类型对象的值由其中的某些位确定,而其他位不影响其值。在 C++ 标准中,不影响值的位称为填充位。
例如,考虑一个有 8 位的类型,其中最后 4 位是填充位,那么 00000000 和 00001111 表示的对象具有相同的值,并且比较相等。
了解了上面的知识,就可以理解书上的内容了。它说无符号类型没有填充位。然而,这种说法是错误的。事实上,标准只保证unsigned char
(and signed char
, char
) 没有填充位。以下是标准[basic.fundamental]/1相关部分的引用:
对于窄字符类型,对象表示的所有位都参与值表示。
此外,C11 标准 6.2.6.2/1 说
对于 unsigned char 以外的无符号整数类型,对象表示的位应分为两组:值位和填充位(后者不需要任何一个)。
例如,一个字节包含 8 位,所有 8 位都用于从 0 开始计数。
对于无符号,所有位 0 = 00000000 表示 0, 00000001 = 1, 00000010 = 2, 00000011 = 3, ... 直到 11111111 = 255。
对于有符号字节(或有符号字符),最左边的位表示符号,并且因此不能用于计数。(我在光学上分离最左边的位!)0 0000001 = 1,但 1 0000001 = -1、0 0000010 = 2 和 1 0000010 = -2 等等,直到 0 1111111 = 127 和 1 1111111 = -127。在此示例中,1 0000000 表示 -0,这是无用/浪费的,因此它可以表示例如 128。
还有其他方法可以将位编码为数字,有些计算机从左侧开始而不是从右侧开始。这些细节是特定于硬件的,与理解“无符号”无关,你只需要在你想用单个位弄乱代码时关心这一点(不推荐)。
这意味着所有 8 位都代表一个实际值,而在有符号字符中只有 7 位代表实际值,第 8 位(最高有效位)代表该值的符号 - 正或负 (+/-)。
这主要是理论上的事情。在真实硬件上,signed
整数也一样。显然,对于有符号整数,其中一些值是负数。
回到unsigned
- 文本所说的基本上是无符号数的值只是 1<<0 + 1<<1 + 1<<2 + ... 直到总位数。重要的是,不仅所有位都有贡献,而且所有位组合形成一个有效数字。这不是signed
整数的情况。因此,如果您需要位掩码,它必须是一种unsigned
足够宽的类型,否则您可能会遇到无效的位模式。