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

标签 c printf unsigned signed

给出以下代码片段:

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 xunsigned char y 在作为参数传递给 之前都会提升为 int。 . 函数归因于通常的算术转换。 (int 范围内的类型将提升为 int)。

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

关于c - printf 如何知道变量传递的是有符号还是无符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59597527/

相关文章:

c - 逐个字符打印字符串,不带空格

c++ - 调试时 Fprintf 奇怪的输出

java - 我需要帮助 : Send a list of bytes with UDP to a Server, o 它适用于有符号/无符号字节

c - 在回调函数中访问 GTK 小部件的结构时如何避免段错误?

c - Xcode 声称 "this"是 C 中的保留语言关键字?

c - 分配给位域时的 GCC 转换警告

c - 使用 fgets 和使用 printf 只打印一些行

c - 为什么转换为 size_t 的负数在 C 中变成了一个巨大的数字?

mysql - UPDATE 表 SET 列 = GREATEST(列+数字,0)

释放后检查结构体是否释放