printf 如何知道变量传递的是有符号还是无符号

You*_*f13 -1 c printf unsigned signed

鉴于以下代码片段:

signed   char x = 150;
unsigned char y = 150;
printf("%d %d\n", x, y);
Run Code Online (Sandbox Code Playgroud)

输出是:

-106 150
Run Code Online (Sandbox Code Playgroud)

但是,对于以相同方式在内存中表示的变量,我使用了相同的格式说明符。printf 如何知道它是有符号的还是无符号的。

两种情况下的内存表示为:

10010110
Run Code Online (Sandbox Code Playgroud)

chu*_*ica 5

signed char x = 150;incurs 实现将行为定义为150不在 OP 的范围内signed char

150 是一个int不适合的signed char范围经历:

新类型是有符号的,值不能在其中表示;要么结果是实现定义的,要么引发实现定义的信号。C17dr § 6.3.1.3 3

在这种情况下,x取值为 150 - 256。

好的代码不会假设这个结果为 -106,而是不会分配给signed char它范围之外的值。

然后 ...

通常,由于通常的算术转换,在作为参数传递给函数之前 signed char xunsigned char y都被提升为和。(范围内的类型被提升为)。int...intint

因此printf("%d %d\n", x, y);不是问题。 printf()接收 2int秒并且与说明"%d"符匹配。