printf如何知道何时将其传递给带符号的int

时间:2019-12-17 17:57:33

标签: c linux

我试图弄清楚变量实际上是如何在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

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;