在Kernighan& Ritchie,它说“当签名或无符号的char数据类型依赖于机器时,所有可打印字符都是正数。”
有人可以向我解释这条线的含义吗?我的系统有签名字符,但即使是-90的负值,printf也会打印一个字符(即使它不是一个非常熟悉的字符)。
答案 0 :(得分:2)
ASCII字符集定义了从0x00
到0x7F
的代码点。如果用无符号或有符号字节值表示它们并不重要,因为这个范围对于两者都是通用的。
可打印字符介于0x20
和0x7E
之间,它们都是ASCII的一部分。术语可打印字符未定义可打印的世界中的每个可能字符。相反,它是在ASCII领域内定义的。
从0x80
到0xFF
的字节值未在ASCII中定义,不同的系统将不同的字符分配给此范围内的值,从而导致许多不同类型的代码页在ASCII范围内相同但在这个范围。这也是有符号和无符号字节值不同的范围。
printf
的实现在其输入中遇到%c
键时查找单个字节值。作为printf
函数的调用者但printf
不知道这一点,此字节值可能会根据您的观点进行签名或无符号。它只是将这8个比特传递给它所连接的输出流,并且该流在0x00
和0xff
内发出字符。
符号的概念在输出字符的内部没有任何意义。因此,无论您是发送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的字符。