好的,我觉得问这个很愚蠢,但是为什么下面的代码输出不同的行?
要打印第一行,我将地址指向数组的第一个字节,将其解释为指向 uint16_t 的指针,获取值并逐个打印它。
对于第二行,我获取指向第一个字节的指针,将其解释为指向 uint8_t 的指针,获取值并逐个打印它。然后对第二个字节做同样的事情。
由于我不修改为数组分配的内存,只以不同的方式解释它,我希望输出相同,但字节顺序不同。
我可能错过了一些东西,但我唯一的猜测是间接运算符做了我没想到的事情。
#include <iostream>
#include <string.h>
int main() {
uint8_t u[2];
u[0] = 170;
u[1] = 85;
for(int i = 15; i >= 0; --i) {
printf( "%u", (((*((uint16_t*)u)) >> i) & 0x0001));
}
printf( "\n");
for(int i = 7; i >= 0; --i) {
printf( "%u", (((*((uint8_t*)u)) >> i) & 0x01));
}
for(int i = 7; i >= 0; --i) {
printf( "%u", (((*((uint8_t*)(u + 1))) >> i) & 0x01));
}
}
输出
0101010110101010
1010101001010101
更新#1:请忽略分配,是的,示例代码不适用于每个操作系统,但这只是一个简化的示例。
更新#2:我知道字节序,但我错过的是逻辑与物理位表示。在上面的示例中,即使物理表示未更改,我也会打印受字节序影响的逻辑表示。非常感谢@john-kugelman 对此的解释。