ASCII表 – 负值
可能重复:
负ASCII值
int main() { char b = 8-'3'; printf("%c\n",b); return 0; }
我运行这个程序,我得到一个看起来像问号(?)的标志。
我的问题是,为什么它打印出来而不打印任何内容,因为据我所知,ASCII表中的b值为-43,这是不存在的。
顺便说一下,当我编译这段代码时:
int main() { char b = -16; printf("%c\n",b); return 0; }
我一无所获。
这是C 2011标准中规定的行为
7.21.6.1 fprintf函数
…
8转换规范及其含义如下:
…
c
如果不存在l
length修饰符,则将int
参数转换为unsigned char
,并写入生成的字符。如果存在
l
长度修改器,则wint_t
参数将被转换为好像没有精度的ls
转换规范和指向wchar_t
的双元素数组的初始元素的参数,第一个元素包含wint_t
参数。lc
转换规范,第二个是null宽字符。
-43正在转换为无符号值(213),因此它正在打印扩展的ASCII字符。
那是因为-16
与hex0xf0
相同,它与240
相同。 在我的角色集(ISO 8859-1)中,该角色是LATIN SMALL LETTER ETH
或'ð'
。
没有“负ASCII”值这样的东西。 ASCII定义0到127之间的字符和控制代码。
大多数系统不使用纯ASCII。 他们使用其他一些字符集。 几乎所有其他字符集都匹配ASCII,用于0到127之间的值,但它们定义了更高值的附加字符和控制代码。
在某些C和C ++实现中, char
对应于一个带符号的char,它可以取值-127到+127(在大多数情况下从-128到+127)。 在其他实现中, char
是从0到255的无符号值。
如果您有一个带有负值的签名char
并尝试打印它,则库会将其视为unsigned char
(例如,-1变为255),并且它将打印平台字符集中与该值对应的任何字符。 如果没有为特定值分配字符,库可能会选择显示一些默认的占位符字符,如问号或框。
打印时,字符在内部被解释为“无符号”。 因此,它将是255 – 16 =第239个字符。 屏幕控制台上打印了订单239的ascii值。 类似地,-43是212。
%c
格式化将始终打印一个字符,因此可能只需要将char
的位作为无符号值处理,最终将其设置为最高位。 您的终端可能会将这些字符显示为空白或带有问号的占位符,但我的节目显示Õ和ð…
如果要在值为负时不打印任何内容,则需要检查它(并使用更大的数据类型,例如int
以便您可以将非char值与所有可能的chars一起使用,或者使用signed char
你希望确保你得到一个签名类型;一个普通的char
可以是签名或未签名的)。
您可以参考ASCII表 。 并且所有数字都应映射到(256+(值))%256(这是溢出处理的方式)。 您应该能够找到哪个符号打印了哪个号码。