相关疑难解决方法(0)

为什么bit endianness是bitfields中的一个问题?

任何使用位域的可移植代码似乎都区分了小端和大端平台.有关此类代码的示例,请参阅linux内核中struct iphdr声明.我无法理解为什么位字节序是一个问题.

据我所知,bitfields纯粹是编译器构造,用于促进位级操作.

例如,考虑以下位域:

struct ParsedInt {
    unsigned int f1:1;
    unsigned int f2:3;
    unsigned int f3:4;
};
uint8_t i;
struct ParsedInt *d = &i;
只是一种简洁易懂的说法d->f2.

但是,无论架构如何,位操作都是明确定义的并且可以正常工作.那么,bitfields怎么不便携?

c portability cross-platform low-level bit-fields

54
推荐指数
4
解决办法
3万
查看次数

在C中使用位字段时的字段顺序

我有一个以下类型的结构

typedef struct
{
unsigned int a : 8;
unsigned int b : 6;
unsigned int c : 2;
}x, *ptr;
Run Code Online (Sandbox Code Playgroud)

我想做的是改变字段c的值.

我做了类似以下的事情

x structure = { 0 };
x->c = 1;
Run Code Online (Sandbox Code Playgroud)

当我查看内存映射时,我希望找到00 01,但我找到00 40.看起来在排列第二个字节时,它将c字段放在最低位中,将b字段放在最高位中.我在GCC和Windows编译器上看过这个.

现在,我做的是以下,这是正常的.

unsigned char ptr2 = (unsigned char*) ptr
*(ptr2 + 1)  &= 0xFC
*(ptr2 + 1)  |= 0x01
Run Code Online (Sandbox Code Playgroud)

我看内存图错了吗?谢谢您的帮助.

c gcc bit-manipulation bit bit-fields

9
推荐指数
3
解决办法
1万
查看次数