#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 机器之间会有所不同?
是的。在运行时检测字节序的经典方法如下:
uint32_t var = 1;
uint8_t *ptr = (uint8_t*)&var;
if(*ptr) puts("Little Endian");
else puts("Big Endian");
即使 257 => 0x0101,int 很可能是 32 位,在这种情况下,在 BE 机器上它将打印 00,在 LE 上打印 11。
是的,它会的。我总是这样写,因为我不确定运算符优先级:
*(((char*)ptr)+1)
并实现你想要的改变你%d
的%c
格式字符串。
是的,这将是实现定义的行为。
当您转换ptr
并(char *)
访问第一个内存位置时,将访问存储在内存中的第一个字节,这取决于系统是大端还是小端系统。
在调用printf
函数之前,对参数进行评估。并且如上所述的这种评估对于不同的系统会得到不同的值。因此它是实现定义的。