5
#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 机器之间会有所不同?

4

3 回答 3

8

是的。在运行时检测字节序的经典方法如下:

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。

于 2012-09-12T04:55:52.553 回答
3

是的,它会的。我总是这样写,因为我不确定运算符优先级:

*(((char*)ptr)+1)

并实现你想要的改变你%d%c格式字符串。

于 2012-09-12T04:56:18.123 回答
2

是的,这将是实现定义的行为。

当您转换ptr(char *)访问第一个内存位置时,将访问存储在内存中的第一个字节,这取决于系统是大端还是小端系统。

在调用printf函数之前,对参数进行评估。并且如上所述的这种评估对于不同的系统会得到不同的值。因此它是实现定义的。

于 2012-09-12T05:00:17.547 回答