是否存在此C代码无法按预期工作的情况?

时间:2013-10-12 00:07:51

标签: c type-conversion memcpy

x86或x64计算机上是否存在此程序无法输出0xFFFF的情况?或者它保证没有问题吗?

#include <stdlib.h>
#include <stdio.h>


int main()
{
    unsigned short int s = 0;
    unsigned long int l = 0xFFFFFFFF;
    memcpy(&s, &l, sizeof(short));
    printf("0x%.4X", s);
    return 0;
}   

3 个答案:

答案 0 :(得分:5)

由于C不保证数据类型的最大大小,只保证最小值,如果使用unsigned long的编译器占用超过32位,其中初始字节的地址对应最重要的unsigned long(即大端)的字节,这不会产生FFFF结果。

答案 1 :(得分:2)

,因为.4的{​​{1}}说明符指定了最小值,而不是最大值。如果printf有32位而不是16位(这是允许的,因为它只有根据标准的最小大小),而是会打印“0xFFFFFFFF”。

否则,假设x86和x64是little-endian,这通常会发生,因为“FF”字节存储在long int的开头。 long int具有位模式“FF FF FF FF”,并且short int从头开始。

即使long int是64位,“FF”字节仍然在开头:“FF FF FF FF 00 00 00 00”。

即使是以下输出“0xFFFF”,我们在long int中的FF字节较少:

short int

答案 2 :(得分:1)

我认为答案是肯定的,因为x86 / x64是little-endian