C ++和无符号类型

时间:2018-07-01 02:41:11

标签: c++ unsigned bit-representation

我正在阅读C ++ Primer 5th Edition,但我不理解以下内容:

  

在无符号类型中,所有位代表该值。例如8位   unsigned char可以保存0到255之间的值。

“所有位代表值”是什么意思?

5 个答案:

答案 0 :(得分:1)

您应该将此与signed类型进行比较。在signed值中,一位(最高位)用于指示该值是正还是负,而其余位用于保留该值。

答案 1 :(得分:1)

平凡可复制类型的对象的值由其中的某些位确定,而其他位则不影响其值。在C ++标准中,不影响该值的位称为填充位

例如,考虑具有8位的类型,其中最后4位是填充位,则以00000000和00001111表示的对象具有相同的值,并进行比较。

实际上,填充位通常用于alignment和/或error detection

了解了以上知识之后,您就可以了解这本书在说什么。它说无符号类型没有填充位。但是,该陈述是错误的。实际上,该标准仅保证unsigned char(以及signed charchar)没有填充位。以下是标准[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类型的足够的宽度,否则可能会遇到无效的位模式。