我使用int,char和unsigned int。
例如,如果我执行int foo = 1;
,它是否始终将foo设为0x00...00001
?无论它的长度是多少,还是只适用于无符号类型?
这是因为我正在比较比特。
答案 0 :(得分:4)
这个问题有些不明确。根据定义,1
(十进制) 0x00...001
(十六进制)。
你提到"比特",所以我假设你真的在问这个:
是否保证
foo & (1 << n)
只评估true
的{{1}}?&#34;。
如果是这样,答案是&#34;是&#34;。
答案 1 :(得分:2)
你会得到很多复杂的答案,关于标准实际上关于比特代表等的说法。但真正的答案是:是的,1总是0x000000 .... 1.大小 - 1个零位,但是大小是你正在使用的类型有很多位。
请注意,类型的长度不是由C标准定义的,但您可以轻松找到适合您的平台的类型。即是int 16,24,32,64位。
正如有人正确地说 - 关于字节序。这可能对你来说完全不可见,也可能在你的脸上爆炸,这取决于你在做什么以及你有多幸运(如果你在一个大端平台上,你可能永远不会知道什么是字节顺序)。如果你在C中进行位操作,那么你可以忽略它(&gt;&gt;&lt;&lt;&amp; |〜etc.)。如果您正在对项目进行操作&gt;然后将8位存储为一个事物(比如说是一个字节数组),然后将它们作为int,short等读回来,那么你就会遇到问题。
答案 2 :(得分:1)
因为1为正,所以它仅表示为0x0000 ... 00001。但在内存中如何存储它取决于字节的存储方式。阅读Big-endian
ang little-endian
系统,了解有关在内存中存储字节的信息。
答案 3 :(得分:1)
6.2.6.2整数类型
1对于除unsigned char
以外的无符号整数类型,对象的位 表示应分为两组:值位和填充位(需要 不是后者中的任何一个)。如果有 N 值位,则每个位应表示不同的值 功率2在1和2之间 N -1 ,以便那种类型的物体能够 使用纯二进制表示来表示0到2 N -1的值;这应该是 称为价值表示。任何填充位的值都是未指定的。 53)
2对于有符号整数类型,对象表示的位应分为三个 groups:值位,填充位和符号位。不需要任何填充位;signed char
不得有任何填充位。应该只有一个符号位。 作为值位的每个位应具有与对象中相同位相同的值 表示相应的无符号类型(如果有符号中有 M 值位) 在无符号类型中键入 N ,然后 M ≤ N )。如果符号位为零,则不会影响 结果值。如果符号位为1,则该值应在其中一个中修改 以下方式:
- 符号位0的相应值被否定(符号和幅度);
- 符号位的值为 - (2M)(二进制补码);
- 符号位的值为 - (2M - 1)(补码)。
其中的哪一个适用于实现定义,以及符号位为1的值是否正确 并且所有值位为零(对于前两个),或者使用符号位和所有值位1(对于' 补码),是陷阱表示或正常值。在签名和 幅度和1'补码,如果这个表示是一个正常值,它被称为a 负零。
53)填充比特的某些组合可能生成陷阱表示,例如,如果一个填充 bit是奇偶校验位。无论如何,对有效值的算术运算都不会产生陷阱 表示除了作为特殊情况的一部分,例如过度流动,并且这不会发生 使用无符号类型。填充比特的所有其他组合是替代对象表示 值位指定的值。
这在实践中意味着带符号的正值1应该将低位值位设置为1而所有其他值位设置为0.我从未在有填充位的系统上工作过(至少我必须考虑到的任何事情)。
正如其他人所指出的那样,在进行按位操作时,你必须注意字节顺序。