uint32_t的字节输出

时间:2013-02-12 10:38:34

标签: c bit-shift endianness

我试图更好地理解按位运算符。我有一些类型uint32_t,我试图逐字节输出。这样做的代码是:

void printByteWise(uint32_t num) {

  printf("byte 1 = %u\n", (num & 0xFF000000));
  printf("byte 2 = %u\n", (num & 0x00FF0000));
  printf("byte 3 = %u\n", (num & 0x0000FF00));
  printf("byte 4 = %u\n", (num & 0x000000FF));
}

上面的代码示例中的num是9.然后字节数组应该存储在内存中,如下所示:
09 00 00 00(按地址递增顺序)。如果是这样,输出应为:
byte 1 = 09
byte 2 = 00
byte 3 = 00
byte 4 = 00
但我得到的输出是:

byte 1 = 0
byte 2 = 0
byte 3 = 0
byte 4 = 9

我正在使用像小端一样的系统:

int is_bigEndian() {
  int i = 1;
  char *low = (char *) (&i);
  return *low ? 0 : 1;
}  

这种行为是否正确?为什么我会看到这种行为?

2 个答案:

答案 0 :(得分:3)

请记住,两个操作数都是相同的字节顺序。

在小端,是的,9将被存储为0x09000000。然后使用0xFF000000进行屏蔽,它将作为0x000000FF存储在内存中,因此将在该模式中用作掩码。

如果你想完全看到效果,就像Ali Veli所说的那样,并使用char指针逐字节地迭代内存。

答案 1 :(得分:0)

对于按位运算符,您的操作数实际上是寄存器中不在内存中的数字。所以这里与endianness无关,这是预期和正确的。

如果通过将变量的地址转换为char *或其他东西来检查变量,并通过增加指针的值来超过字节,那么每次都会从内存中读取一个字节(假设缓存是透明的)并且你会看到字节序的效果。

相关问题