给出以下代码片段:
signed char x = 150;
unsigned char y = 150;
printf("%d %d\n", x, y);
输出为:
-106 150
但是,对于以same方式在内存中表示的变量,我使用same格式说明符。 printf 如何知道它是有符号还是无符号。
两种情况下的内存表示为:
10010110
最佳答案
signed char x = 150;
导致实现定义行为,因为 150
不在 OP 的 signed char
范围内。
150 是一个 int
并且不适合 signed char
范围:
the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised. C17dr § 6.3.1.3 3
在本例中,x
的值为 150 - 256。
好的代码不会假设结果为 -106,而是不会分配给范围之外的 signed char
值。
然后...
通常,signed char x
和 unsigned char y
在作为参数传递给 之前都会提升为
函数归因于通常的算术转换。 (int
。 .int
范围内的类型将提升为 int
)。
因此 printf("%d %d\n", x, y);
不是问题。 printf()
接收 2 个 int
并且与 "%d"
说明符匹配。
关于c - printf 如何知道变量传递的是有符号还是无符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59597527/