c,big-endian系统中的十六进制表示

时间:2014-07-17 10:09:07

标签: c hex endianness

结果是什么:

int x = 0x00000001;
int y = 0x80000000;

在大端系统中?

我的目标是定义一个具有第一个(内存中)位集的int,无论它是最重要的还是最不重要的。我知道使用little-endian系统,x会满足这个要求,但在大端系统中它仍然是正确的吗?

我非常确定以下内容适用于两个系统:

char c[4] = {0x80, 0, 0, 0};
int x = (int) c;

这是对的吗?有更优雅的方法吗?

(我没有大端系统可以进行试验)

2 个答案:

答案 0 :(得分:1)

你可能想要的是:

int x = 0;
char* p = (char*)&x;
p[0] = 0x01;

上面的代码会将int变量的最低地址字节中的最低有效位设置为1:

  • 在Big-Endian处理器上,它会将MS字节中的LS位设置为1(即x == 0x10000000)。
  • 在Little-Endian处理器上,它将LS字节中的LS位设置为1(即x == 0x00000001)。

话虽如此,你对#34;第一位"的定义是什么?恕我直言,这只是最不重要的一个,在这种情况下,int x = 0x00000001是答案,无论处理器的字节顺序如何!


以下术语可能会帮助您更好地理解:

  • 将最低有效位设置为8位字节:0x01
  • 设置8位字节中的最高有效位:0x80
  • 将最低有效字节设置为4字节整数:0x000000FF
  • 将最高有效字节设置为4字节整数:0xFF000000
  • 在LE处理器上设置4字节整数的最低地址字节:0x000000FF
  • 在BE处理器上设置4字节整数的最低地址字节:0xFF000000
  • 在LE处理器上设置4字节整数的最高地址字节:0xFF000000
  • 在BE处理器上设置4字节整数的最高地址字节:0x000000FF

答案 1 :(得分:1)

你可以尝试工会

union foo
{
  char array[8];
  int64_t num;
};