这段代码将如何在大端机器上运行?
如果我有代码:
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
问题 :
-
大端机器上的行为是否相同?
-
如果我在b中指定一个值或者进行类型转换,那么大端的结果是否相同?
你在那里的代码将以相同的方式工作。 这是因为向下转换的行为由C标准定义。
但是,如果你这样做:
uint64_t a = 0x0123456789abcdefull; uint32_t b = *(uint32_t*)&a; printf("b is %x",b)
然后它将依赖于endian。
编辑:
Little Endian:b是89abcdef
Big Endian:b是01234567
在分配变量时,编译器会为您处理事情,因此big-endian上的结果将是相同的。
在对内存进行类型转换时,结果在big-endian上不一样。
直接赋值将在小端和大端上产生相同的结果。
大端机器上的内存类型转换将输出
a是1111222233334444 b是11112222