【发布时间】:2018-05-04 09:16:16
【问题描述】:
我的编译器支持所谓的“类型限定符”__bigendian 和 __littleendian。
我的变量Buffer 看起来像这样:
static union
{
uint8 as_byte[10];
__bigendian uint16 as_big_endian[5];
uint16 as_little_endian[5];
} Buffer;
在我的情况下,微控制器是小端格式,但是对于某些通信接口,我需要大端格式的 16 位单元。
微控制器支持指令byte swap,在使用这些类型限定符的情况下编译该指令,所以实际上这似乎是一种舒适的方式。
编译器手册说我应该避免使用“类型限定符”,因为可移植性问题 - 当然!
我只是想知道是否有比使用字节访问和根据目标的字节序手动进行交换更好的方法?
【问题讨论】:
-
这是 C 还是 C++?请记住,对于 C++,访问未最后分配的联合中的变量是 UB。
-
union不会为你交换字节 -
@Anton Malyshev:正确,但我的想法是使用“小端”元素的简单分配给“大端”元素或反之亦然比使用位移更有效,因为“字节交换”指令。
-
如果您使用 C++ 编写代码,请查看 boost endian 库。
标签: c++ endianness