我试图更好地理解按位运算符。我有一些类型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;
}
这种行为是否正确?为什么我会看到这种行为?
答案 0 :(得分:3)
请记住,两个操作数都是相同的字节顺序。
在小端,是的,9将被存储为0x09000000。然后使用0xFF000000进行屏蔽,它将作为0x000000FF存储在内存中,因此将在该模式中用作掩码。
如果你想完全看到效果,就像Ali Veli所说的那样,并使用char
指针逐字节地迭代内存。
答案 1 :(得分:0)
对于按位运算符,您的操作数实际上是寄存器中不在内存中的数字。所以这里与endianness无关,这是预期和正确的。
如果通过将变量的地址转换为char *或其他东西来检查变量,并通过增加指针的值来超过字节,那么每次都会从内存中读取一个字节(假设缓存是透明的)并且你会看到字节序的效果。