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