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机器上的行为会相同吗

  • 如果我在b中指定a的值,或者进行类型转换,结果会在big-endian中相同吗


  • 当分配变量时,编译器会为您处理事情,所以在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兄弟。。