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(这是溢出处理的方式)。 您应该能够找到哪个符号打印了哪个号码。