C 这段代码将如何在big-endian机器上工作?
如果我有密码:C 这段代码将如何在big-endian机器上工作?,c,endianness,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 问题: 在big endian机器上的行为会相同吗 如果我在b中指定a的值,或者进行类型转换,结果会在big-endian中相同吗 当分配变量时,编译器会为您处理事情,所以在big-endia
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
问题:
当分配变量时,编译器会为您处理事情,所以在big-endian上的结果是相同的
当类型转换指向内存的指针时,在big-endian上的结果将不同。那里的代码将以相同的方式工作。这是因为向下投射的行为是由C标准定义的 但是,如果您这样做:
uint64_t a = 0x0123456789abcdefull;
uint32_t b = *(uint32_t*)&a;
printf("b is %x",b)
那么它将是endian依赖的
编辑:
小恩迪安:b是89abcdef
大端数:b是01234567直接赋值将在小端数和大端数上产生相同的结果 big-endian机器上的内存类型转换将输出
a是1111222233334444 b是11112222因此您的意思是这将在两方面给出不同的结果….+1请注意,标准中仅定义了无符号向下广播。签名downcast是“实现定义的”,这意味着编译器只需要做一些一致的事情并记录它。在big-endian上,结果可能是01234567。或者简单地尝试
printf(“a是%X”,a)
。请注意,您应该分别使用PRIx64
和PRIx32
打印这些值。ya man..但间接地说,在每台机器上这两个值都是相同的。最好是编写10年后不会中断的代码,因为他们认为128位的内存不够个人电脑使用,突然sizeof(long)==sizeof(int)
不再是真的。@Chris Lutz ya我现在明白你的意思了,我会记住这一点。。!!thnks兄弟。。