联盟和字节序

Val*_*ade 6 c cpu endianness

typedef union status
{
    int nri;
    char cit[2];
}Status;

int main()  {
    Status s;
    s.nri = 1;
    printf("%d \n",s.nri);
    printf("%d,%d,\n",s.cit[0],s.cit[1]);
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

1
0,1
Run Code Online (Sandbox Code Playgroud)

我知道第二行的输出取决于CPU的结束.我怎么能在平台独立的程序中写这样的?有没有办法检查CPU的endianess?

jxh*_*jxh 4

您可以使用htonl()和/或ntohl()htonl()代表“主机到网络长”,而ntohl()代表“网络到主机长”。“主机”和“网络”指的是字节顺序。网络字节顺序是“big-endian”。如果主机平台也是“big-endian”,则操作将是空操作。使用这些例程,以下程序将始终报告相同的输出:

uint32_t x = htonl(1);
unsigned char *p = (void *)&x;
printf("%u %u %u %u\n", p[0], p[1], p[2], p[3]);
uint32_t y = ntohl(x);
assert(y == 1);
Run Code Online (Sandbox Code Playgroud)

  • 原始帖子中没有任何内容表明他们甚至有操作系统...无论如何,自己编写字节序检查并不是特别困难,您不需要涉及某些 API 函数。`int a = 0xAABBCCDD; if(*(uint8_t*)&a == 0xAA) put("大") else put("小");`。 (6认同)