我试图弄清楚变量实际上是如何在C中工作的,并且发现printf
函数似乎如何知道相同大小的不同变量之间的区别很奇怪,我假设它们都是16位。
#include <stdio.h>
int main(void) {
unsigned short int positive = 0xffff;
short int negative = 0xffff;
printf("%d\n%d\n", positive, negative);
return 0;
}
输出:
65535
-1
答案 0 :(得分:1)
我认为我们一方面必须更仔细地区分不同整数类型的类型转换,另一方面要printf
格式说明符(允许强制printf
解释数据)之间进行区分。手。
系统地:
printf("%hd %hd\n", positive, negative);
// gives: -1 -1
这两个值都被printf
解释为 signed short int ,无论声明如何。
printf("%hu %hu\n", positive, negative);
// gives: 65535 65535
printf
都将这两个值解释为 unsigned short int ,无论声明如何。
但是
printf("%d %d\n", positive, negative);
// gives: 65535 -1
两个值都隐式转换为(较长) int ,同时保留符号。
最后,
printf("%u %u\n", positive, negative);
// gives 65535 4294967295
同样,在保留符号的同时,两个值都隐式转换为 int ,但是负值将被解释为无符号。正如我们在这里看到的,普通int
实际上是32位(在此系统上)。
奇怪的是,仅当我使用gcc
和-Wpedantic
进行编译时,它才向我警告分配short int negative = 0xffff;
。