【问题标题】:c, hex representation in big-endian systemc、大端系统中的十六进制表示
【发布时间】:2014-07-17 10:09:06
【问题描述】:

结果是什么:

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

在大端系统中?

我的目标是定义一个 int,它设置了第一个(在内存中)位,无论它是最重要的还是最不重要的。我知道对于 little-endian 系统,x 可以满足这个要求,但在 big-endian 系统中仍然如此吗?

我很确定以下内容在两个系统中都可以使用:

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

正确吗?有没有更优雅的方法?

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

【问题讨论】:

  • “第一个位组”?你对“第一”的定义是什么?恕我直言,这是最不重要的一个,在这种情况下,0x00000001 是您的答案,无论字节序如何。
  • 第二种方法会将数组的地址转换为int,所以它不起作用。
  • 第一个字节的第一位是高位还是低位?
  • 好的,我对第一个的定义是内存中的第一个。

标签: c hex endianness


【解决方案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)。

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


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

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

【讨论】:

  • 我对“第一”的定义是关于记忆位置的。
  • @giladrv:位没有内存位置,因为内存地址的最小单位是字节。无论如何,如果您想在最低地址字节中设置最低有效位,那么上面的解决方案应该可以工作。
  • 我想在整个 int 上右移该位,即:100000... >> 01000... >> 00100... (这就是我提到第一位的上下文,即最左边)
  • @giladrv:无论字节序如何,右移(或任何其他算术运算)的工作方式相同。您无需关心如何构造整数值,以便正确执行操作!!!
  • 我并不是要让你难过,但我还是不清楚。所以一个字节中最左边的位总是最重要的?即它将通过将 0x80 分配给该字节来设置?真的吗?这与字节顺序无关吗?
【解决方案2】:

你可以试试联合

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

【讨论】:

    猜你喜欢
    • 2021-02-07
    • 2015-04-19
    • 1970-01-01
    • 2018-11-13
    • 2012-09-08
    • 2011-06-01
    • 2020-01-10
    • 1970-01-01
    • 2016-02-06
    相关资源
    最近更新 更多