通过引用32/64位传递时C中的字节顺序问题

时间:2011-03-10 10:01:08

标签: c endianness

在下面的示例中,我正在努力解决字节序问题。 在这个main()传递32位整数的地址,myfunc()以64位接收它。

#include <stdint.h>
#include <stdio.h>

void myfunc(uint64_t *b)    
{    
    printf("%llx\n", *b);    
if ((*b & 255) == 127)    
   printf("\n It works\n");    
else    
    printf("\n Not working\n");    
}

main()    
{    
uint32_t a = 127;    
    printf("\n%lx\n", a);
    myfunc(&a);
}

它在小端平台(Windows)上正常工作。

7f
28ff780000007f

它有效

但它在big endian(AIX)上失败了。

7f
7fdeadbeef

不工作

我认为当我们传递32位的地址并在64位接收时,在大端平台上它接收到其他32位。但我不确定。 请帮助我了解这背后发生的事情。我不能在这里正确编写第一行程序。

非常感谢 安

1 个答案:

答案 0 :(得分:5)

首先,您编写了触发未定义行为的代码。您分配一个32位变量a,然后(在myfunc()中)尝试使用它,就好像它是64位 - 更大的大小,因此您有效地尝试访问合法分配的变量。这可能会导致任何后果,并且您的程序无法正常工作,因为从C标准的角度来看,您尝试做的事情毫无意义。