#include<stdio.h>
int main (void)
{
int i=257;
int *ptr=&i;
printf("%d%d",*((char*)ptr),*((char*)ptr+1));
return 0;
}
上面的代码实现的输出是否会定义,输出会在little endian和big endian机器之间有所不同?
答案 0 :(得分:8)
是。在运行时检测字节序的经典方法是以下方式:
uint32_t var = 1;
uint8_t *ptr = (uint8_t*)&var;
if(*ptr) puts("Little Endian");
else puts("Big Endian");
即使257 =&gt; 0x0101,一个int很可能是32位,在这种情况下,它将在BE机器上打印00,在LE上打印,11。
答案 1 :(得分:3)
是的,它会。 我总是这样写,因为我从不确定运算符优先级:
*(((char*)ptr)+1)
要实现您的目标,请将格式字符串中的%d
更改为%c
。
答案 2 :(得分:2)
是的,它将是实现定义的行为。
当您使用ptr
转换(char *)
然后访问第一个内存位置时,将访问存储在内存中的第一个字节,这取决于系统是大端还是小 - 结束系统。
在调用printf
函数之前,将评估参数。如上所述的这种评估将为不同的系统获得不同的值。因此它是实现定义的。