3

在 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;
}   
4

3 回答 3

5

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

于 2013-10-12T00:17:55.960 回答
2

,因为说明.4printf指定了最小值,而不是最大值。如果short int有 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 字节更少:

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


int main()
{
    unsigned short int s = 0;
    unsigned long int l = 0xFFFF;
    memcpy(&s, &l, sizeof(short));
    printf("0x%.4X", s);
    return 0;
}
于 2013-10-12T00:33:06.287 回答
1

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

于 2013-10-12T00:17:34.020 回答