我正在阅读此链接
http://dec.bournemouth.ac.uk/staff/awatson/micro/articles/9907feat2.htm
我无法理解链接中的以下声明,请帮助我理解这一点。
程序员只是写了一些移动或掩盖的宏 适当的位来获得所需的东西。但是,如果数据涉及 更长的二进制编码记录,C API遇到了问题。我有, 多年来,看到了许多冗长,复杂的二进制记录 使用短整数或长整数位字段定义工具。 C 将这些位字段限制为整数定义变量的子字段, 这意味着两个限制:首先,位字段可能是否定的 比基础变量更宽的位数;其次,没有 位字段应与基础变量边界重叠。复杂 记录通常由几个连续的长整数组成 填充了位子字段定义。
符合ANSI标准的编译器可以自由地强加这些大小和对齐 限制和指定,依赖于实现但是 可预测的方式,如何将位字段打包到底层机器中 字结构。结构内存对齐通常不可移植,但是 比特场内存甚至更少。
我从这些陈述中理解的是,宏可用于将位掩码为左移或右移。但我心里怀疑为什么他们会使用宏? - 我认为通过在宏中定义它可以建立可移植性而不管16位或32位操作系统。这是真的吗?我无法理解上述声明中提到的两个缺点.1 .bit字段可能不会更宽2.无位域应与基础变量边界重叠
和行,
复杂记录通常由几个连续的长整数组成 填充了位子字段定义。
答案 0 :(得分:4)
1.bit字段可能不宽
假设你想要一个200位长的位域。
struct my_struct {
int my_field:200; /* Illegal! No integer type has 200 bits --> compile error!
} v;
2.无比特字段应与基础变量边界重叠
假设您需要两个30位的位域,并且编译器使用32位整数作为基础变量。
struct my_struct {
unsigned int my_field1:30;
unsigned int my_field2:30; /* Without padding this field will overlap a 32-bit boundary */
} v;
通常,编译器会自动添加填充,生成具有以下布局的结构:
struct my_struct {
unsigned int my_field1:30;
:2 /* padding added by the compiler */
unsigned int my_field2:30; /* Without padding this field will overlap a 32-bit boundary */
:2 /* padding added by the compiler */
} v;