我遇到了以下代码,并被告知这意味着COL_8888_RED
是“endian independent”。为什么?是什么让这个端点独立?
(我问过原来的编码员,但是他们没有回复我......他们可能他们也不知道。)
union _colours {
uint8 c[3][4];
uint32 alignment;
};
static const union _colours col_8888 = {
{ /* B G R A in memory */
{ 0x00, 0x00, 0xFF, 0xFF, }, /* red */
{ 0x00, 0xFF, 0x00, 0xFF, }, /* green */
{ 0xFF, 0x00, 0x00, 0xFF, }, /* blue */
}
};
#define COL_8888_RED *((uint32 *)&col_8888.c[0])
答案 0 :(得分:11)
在某种意义上,此代码不是“与endian无关”,具有不同endianness的平台将为您提供通过COL_8888_RED
看到的不同值。换句话说,在对endian-dependency的传统理解中,这段代码依赖于endian依赖。
另一个问题是应该使用COL_8888_RED
的位置。也许它的目的是传递给某些API,它本身依赖于字节序依赖于API的字节序依赖性取消COL_8888_RED
的字节序依赖性。在这种情况下,一切都将“按预期”工作,即以字节顺序独立。 (例如,如果API接收颜色值为uint32
,然后使用相同的联合将其分隔为ARGB组件,则无论字节顺序如何,它都将获得正确的原始ARGB值。)
但是,要说COL_8888_RED
本身的值与字节无关是完全错误的。
答案 1 :(得分:3)
字节数是与所有体系结构无关的字节序。通过将其指定为字节数组,程序员可确保数据的一致内容。也可以在任何架构上单独访问这些字节。如果编码器刚刚制作了3个字的数组,机器字节序将在确定位的确切布局中发挥作用。
答案 2 :(得分:2)
我认为作为宏的COL_8888_RED将始终是uint32,只要始终使用宏COL_8888_RED,源字节数组{0x00,0x00,0xFF,0xFF}将始终转换为程序员想要表示RED。
然后,定义意味着您可以在大端或小端机器上编写相同的源代码,并从离散数组转换为逻辑颜色。
编辑:为什么然后,不使用枚举,或像“1”这样的常量?
原始API开发人员可能希望能够在内存中指向{0x00,0x00,0xFF,0xFF}的另一个位置,以便可以编写如下代码:
uint8 *p = malloc( sizeof(uint8)*4 );
fread( p, sizeof(uint8), 4, inBuff );
if( *((uint32 *)p) == COL_8888_RED )
{
printf( "I read red!\n" );
}