【发布时间】:2013-04-06 20:23:25
【问题描述】:
如果我知道我在一个 little-endian 机器上,我如何转换 14 位位域的 endiannes?
struct {
unsigned foo : 14, bar 2;
} baz;
我有一种预感,baz.foo = htons(baz.foo) 将无法正常工作。
【问题讨论】:
-
没有单一的位域布局,因此没有从“小端位域”到“大端位域”的标准转换。如果您指定要转换的布局,也许您的问题是可以回答的,但就目前的形式而言,它不是。
-
另请注意,“字节顺序”是指字节顺序,而不是位顺序。位不可寻址,因此即使您尝试,也无法在一个字节内观察它们是如何存储在内存中的。
-
@PascalCuoq 我在 x86 Linux 上使用 GCC。因此
bar的 2 位将被放置在结构的第一个字节的最高有效位。 -
bar会在最低有效字节的最高有效位中吗?你确定吗? -
我的 GCC 使用完整的 32 位
ints 来存储位域。假设所有 GCC 都这样做,并且假设源布局和目标布局都类似于 GCC,那么您必须进行 32 位字节交换。
标签: c endianness bit-fields