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)
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 x,unsigned char y都被提升为和。(范围内的类型被提升为)。int...intint
因此printf("%d %d\n", x, y);不是问题。 printf()接收 2int秒并且与说明"%d"符匹配。