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;
}
答案 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