Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;和无符号类型 我正在阅读C++入门第五版,我不理解下面的部分:_C++_Unsigned_Bit Representation - Fatal编程技术网

C++;和无符号类型 我正在阅读C++入门第五版,我不理解下面的部分:

C++;和无符号类型 我正在阅读C++入门第五版,我不理解下面的部分:,c++,unsigned,bit-representation,C++,Unsigned,Bit Representation,在无符号类型中,所有位表示值。例如,一个8位 无符号字符可以保存从0到255(含0到255)的值 “所有位代表值”是什么意思?这意味着所有8位代表一个实际值,而在有符号字符中,只有7位代表实际值,第8位(最高有效位)代表该值的符号-正或负(+/-)。您应该将其与有符号类型进行比较。在有符号的值中,一位(顶部位)用于指示该值是正还是负,而其余位用于保存该值。例如,一个字节包含8位,所有8位用于从0开始计数 对于无符号,所有位0=00000000表示0,00000001=10000010=20000

在无符号类型中,所有位表示值。例如,一个8位 无符号字符可以保存从0到255(含0到255)的值


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

这意味着所有8位代表一个实际值,而在有符号字符中,只有7位代表实际值,第8位(最高有效位)代表该值的符号-正或负(+/-)。

您应该将其与有符号类型进行比较。在有符号的值中,一位(顶部位)用于指示该值是正还是负,而其余位用于保存该值。

例如,一个字节包含8位,所有8位用于从0开始计数

对于无符号,所有位0=00000000表示0,00000001=10000010=20000011=3。。。最多11111111=255。
对于有符号字节(或有符号字符),最左边的位表示符号,因此不能用于计数。(我用光学方法分离最左边的位!)0000001=1,但1000001=-1、0000010=2和10000010=-2,以此类推,直到0 1111111=127和1 1111111=-127。在本例中,10000000表示-0,这是无用/浪费的,因此它可以表示例如128


还有其他方法将位编码成数字,有些计算机从左边开始,而不是从右边开始。这些细节是特定于硬件的,与理解“unsigned”无关,当您想用单个位(不推荐)将代码弄乱时,只需注意这些细节。

这主要是一个理论问题。在实际硬件上,
有符号
整数也是如此。显然,对于有符号整数,其中一些值是负数


回到
unsigned
——本文所说的基本上是,无符号数的值仅为1可复制类型的对象的值由其中的一些位确定,而其他位不影响其值。在C++标准中,不影响值的位称为填充位。

例如,考虑一个8位的类型,其中最后4位是填充位,然后由00000000和00001111表示的对象具有相同的值,并且比较相等。

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

了解以上知识,你就能理解这本书的意思。它表示无符号类型没有填充位。然而,这个说法是错误的。事实上,该标准仅保证
无符号字符
(和
有符号字符
字符
)没有填充位。以下是本标准相关部分的引用:

对于窄字符类型,对象表示的所有位都参与值表示

此外,C11标准6.2.6.2/1还规定

对于无符号字符以外的无符号整数类型,对象表示的位应分为两组:值位和填充位(不需要任何后者)


就像你手上的所有手指都代表你的整只手一样,我想这句话是不对的。在有符号和无符号类型中,所有位都表示值。例如,8位可以表示256个唯一值,而不管类型是有符号的还是无符号的。这意味着变量中包含的所有位都可以进行不同的设置,并且设置或未设置的位的每个组合都对应一个不同的值。因此,更改任何位都会更改值,或者(相反)更改值意味着至少有一位已更改。注意:该语句是错误的,因为它暗示了对于未签名的类型这是唯一的,但是对于其他一些类型也是正确的。@ S.M.这个语句是关于未签名类型的,它不涉及签名类型,所以我不确定你怎么认为它不正确,不用担心你的英语,你的问题是清楚的和措辞好的。如果其他的都写得好的话,这里的人会很乐意在语法和拼写方面提供帮助。。。。除了符号幅度编码几乎从不用于整数之外,只有浮点这是
有符号
整数的一种可能实现,但这在现实世界中非常罕见。它被称为一个补码。包括x86、ARM、MIPS、POWER和SPARC在内的实际系统都使用twos补码,但这不是真的。@MSalters所有3种允许的表示法的顶部位都是符号位,1是负数;并且在所有情况下,其他位保持该值(表示在哪些位设置对应于哪些值方面有所不同)@M.M:“符号位”实现具有
-1
等于
1000…1
,即值X和-X仅在单个位中不同,而其他位编码
abs(X)
。二的补码没有符号位;所有位都有一个特定的值。顶部的位恰好是唯一一个负值的位。@m您正在描述的符号幅度表示法。术语“符号位”是指在所有3位中保持符号的位representations@MSalters当我看到一个二补数的顶端是一个
1
,我知道它是负数。然后我将所有的位反转,在结果中加一,得到负值。我的描述特别避免使用1对2的补码,因为在这两个系统中,最上面的位是符号指示符,而剩下的位是值——你只需要对它们进行不同的解释。这不是真的。在进行基本运算时,硬件不会以特殊方式处理顶层位。有符号的数字仍然使用所有的位。它仍然有256个州。Signed/unsigned表示数字所代表的范围。顶部的位子不是特别的。当它是一个有符号的数字时,正好告诉你符号。@William我的答案正是abo