8
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]);
}

输出:

1
0,1

我知道第二行的这个输出取决于 CPU 的字节序。我如何在独立于平台的程序中编写这样的程序?有什么方法可以检查 CPU 的字节顺序吗?

4

3 回答 3

4

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

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);
于 2013-09-18T04:56:00.600 回答
2

如果您想要与字节序无关的代码,那么您也想要与平台无关的代码,否则您的要求没有意义。不依赖字节序的代码不能依赖 int 的大小,也不依赖于 char 的符号。

要获得真正可移植的东西,我想您必须编写类似于以下内容的内容:

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

#define INT_BITS (sizeof(int) * 8)

#define BYTE0_MASK (0xFFu << (INT_BITS -  8))
#define BYTE1_MASK (0xFFu << (INT_BITS - 16))

int main()
{
  int i = 0xAABBCCDD;
  unsigned char arr [2] =
  {
    (i & BYTE0_MASK) >> (INT_BITS -  8),
    (i & BYTE1_MASK) >> (INT_BITS - 16)
  };

  printf("%x %x", arr[0], arr[1]);    
}
于 2013-09-18T07:00:37.463 回答
1

如果您的程序不与其他程序(包括为另一个平台编写的同一程序)通信,则字节顺序通常不是问题,除非您做了一些非常特殊的事情,例如您的问题中定义的联合。当您的程序确实与其他程序通信时,例如将二进制数据保存到文件中,在套接字中发送数据,最好在格式/协议中明确定义字节顺序。或者,您也可以以文本形式传输数据。

于 2013-09-18T05:07:02.473 回答