C代码后变量名后的冒号
可能重复:
‘unsigned temp:3’是什么意思
这是参考页面的C代码示例。
signed int _exponent:8;
“8”和“8”之前结肠的含义是什么?
这是一个位域。 它仅在struct
定义中有效,这意味着系统将仅使用8位作为整数。
它是一个位域,一个模糊和错误的结构特征。 这应该足以让您查找需要知道的信息来处理其他人代码中的位域。 至于你自己的代码,永远不要使用位域。
编辑:由Zack重新编写,与执行自己的位算术相比,位域有明显的缺点,没有任何优势。 这里是其中的一些:
- 您一次只能复制,比较,序列化或反序列化一个位域元素。 做你自己的位算术,你可以一次操作整个单词。
- 你永远不可能有一个指向位域元素的指针。 使用您自己的位算术,您可以将指向较大字的指针和字内的位索引作为“指针”。
- 只要你使用固定大小的类型并知道字节顺序,直接读/写C结构到磁盘或网络是没有位域的中途可移植。 但是,抛出位域,并且即使在给定的cpu架构中,较大类型中的元素的顺序以及使用的总空间和对齐也变得高度依赖于实现。
- C规范有一些非常奇怪的规则,比允许位域元素的签名与你期望的不同,很少有人知道这些。
对于单比特标志,使用您自己的比特算术而不是位域是完全没有脑子的。 对于较大的值,您需要打包,如果在整个地方写出所有位算术太痛苦,请编写一些简单的宏。
这是一个位域规范。
这意味着_exponent
仅从signed int
中取出8
位,通常需要8
位以上。 通常,位字段与无符号类型一起使用。
IIRC,如果一个不符合8位的东西被写入_exponent
,编译器会发出警告。
当该语句在结构内时,表示位字段 。