gpt4 book ai didi

c++ - 了解 C++ 中的位字段打包

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:13 29 4
gpt4 key购买 nike

我正在尝试理解位域。以下示例出现在 C++ online docs 中.

#include <iostream>
struct S {
// will usually occupy 2 bytes:
// 3 bits: value of b1
// 2 bits: unused
// 6 bits: value of b2
// 2 bits: value of b3
// 3 bits: unused
unsigned char b1 : 3, : 2, b2 : 6, b3 : 2;
};
int main()
{
std::cout << sizeof(S) << '\n'; // usually prints 2
}

关于这个例子我不明白的是,在代码上面的注释中说在 b1:3 之后有 2 位未使用。然后在 b3:2 之后有 3 位未使用。为什么?Shoudn'那是 unsigned char 类型中的位数 - 定义位?还是留给下一个分配单元边界的未使用位数?

最佳答案

将所有字段声明打包到一行中会让人很难看清发生了什么。这是同样的东西,但重新格式化:

struct S {
unsigned char b1:3; // 3 bits - b1
unsigned char :2; // 2 bits - unused
unsigned char b2:6; // 6 bits - b2
unsigned char b3:2; // 2 bits - b3
// Total: 13 bits
}; // 3 bits - unused (implicit padding)

两个“未使用”部分是:(1) b1 之后的未命名字段,显式宽度为 2 位; (2) 结构末尾的填充以将其四舍五入为 16 位(下一个 unsigned char 单元)。

关于c++ - 了解 C++ 中的位字段打包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23380247/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com