这段代码将如何在大端机器上运行?

时间:2011-09-01 05:11:10

标签: c endianness

如果我有代码:

uint64_t a = 0x1111222233334444;
uint32_t b = 0;
b = a;
printf("a is %llx ",a);
printf("b is %x ",b);

,输出为:

 a is 1111222233334444 b is 33334444

问题

  1. big-endian机器上的行为是否相同?

  2. 如果我在b中指定一个值或进行类型转换,那么大端的结果是否相同?

3 个答案:

答案 0 :(得分:9)

您在那里的代码将以相同的方式工作。这是因为向下转换的行为由C标准定义。

但是,如果你这样做了:

uint64_t a = 0x0123456789abcdefull;
uint32_t b = *(uint32_t*)&a;
printf("b is %x",b)

然后它将依赖于字节序。

编辑:

Little Endian:b是89abcdef

Big Endian:b是01234567

答案 1 :(得分:1)

分配变量时,编译器会为你处理事情,因此big-endian的结果也是一样的。

在对内存进行类型转换时,结果在big-endian上不一样。

答案 2 :(得分:0)

直接赋值将在小端和大端上产生相同的结果。

大端机器上的内存类型转换将输出

a是1111222233334444 b是11112222