#include<stdio.h>
int main (void)
{
int i=257;
int *ptr=&i;
printf("%d%d",*((char*)ptr),*((char*)ptr+1));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码实现的输出是否会定义,输出会在little endian和big endian机器之间变化?
是.在运行时检测字节顺序的经典方法是以下方式:
uint32_t var = 1;
uint8_t *ptr = (uint8_t*)&var;
if(*ptr) puts("Little Endian");
else puts("Big Endian");
Run Code Online (Sandbox Code Playgroud)
即使257 => 0x0101,int很可能是32位,在这种情况下,它将在BE机器上打印00,在LE上打印11.
是的,这将是实现定义的行为。
当您ptr
使用进行转换(char *)
然后访问第一个内存位置时,将访问存储在内存中的第一个字节,这取决于系统是大端还是小端系统。
在调用printf
函数之前,将对参数进行求值。而上面所说的这种评估对于不同的系统会得到不同的值。因此它是由实现定义的。