更好地理解printf - 当提供的值是负数时,用“%c”打印什么?

时间:2011-07-18 06:51:58

标签: c printf kernighan-and-ritchie

在Kernighan& Ritchie,它说“当签名或无符号的char数据类型依赖于机器时,所有可打印字符都是正数。”

有人可以向我解释这条线的含义吗?我的系统有签名字符,但即使是-90的负值,printf也会打印一个字符(即使它不是一个非常熟悉的字符)。

3 个答案:

答案 0 :(得分:2)

ASCII字符集定义了从0x000x7F的代码点。如果用无符号或有符号字节值表示它们并不重要,因为这个范围对于两者都是通用的。

可打印字符介于0x200x7E之间,它们都是ASCII的一部分。术语可打印字符未定义可打印的世界中的每个可能字符。相反,它是在ASCII领域内定义的。

0x800xFF的字节值未在ASCII中定义,不同的系统将不同的字符分配给此范围内的值,从而导致许多不同类型的代码页在ASCII范围内相同但在这个范围。这也是有符号和无符号字节值不同的范围。

printf的实现在其输入中遇到%c键时查找单个字节值。作为printf函数的调用者但printf不知道这一点,此字节值可能会根据您的观点进行签名或无符号。它只是将这8个比特传递给它所连接的输出流,并且该流在0x000xff内发出字符。

符号的概念在输出字符的内部没有任何意义。因此,无论您是发送255还是-1,都会发出映射到特定代码页中0xFF的字符。

答案 1 :(得分:1)

-90作为有符号的char被重新解释为unsigned char,在这种情况下它的值是166.(-90和166都是十六进制的0xA6。)

答案 2 :(得分:1)

那是对的。所有二进制数均为正数。你是否将其视为否定是你自己的解释。使用the common two's compliment

8位数:10100110为正166,大于128(最大正有符号8位数)。

使用带符号的算术,数字166是-90。

您正在看到ascii值为166的字符。