可能重复:
Negative ASCII value
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;
}
我一无所获。
答案 0 :(得分:4)
7.21.6.1 fprintf函数
...
8转换规范及其含义如下:
...
c
如果不存在l
长度修改器,int
参数将转换为unsigned char
,并写出结果字符。
如果存在l
长度修改器,则wint_t
参数将被转换为仿制 一个ls
转换规范,没有精度和一个指向的参数 到第一个元素wchar_t
的双元素数组的初始元素 包含wint_t
转换规范的lc
参数和。{ 第二个是空宽字符。
将-43转换为无符号值(213),因此它将打印扩展的ASCII字符。
答案 1 :(得分:2)
这是因为-16
与十字0xf0
相同,与240
相同。在我的字符集(ISO 8859-1)中,该字符为LATIN SMALL LETTER ETH
或'ð'
。
答案 2 :(得分:1)
没有“负ASCII”值这样的东西。 ASCII定义0到127之间的字符和控制代码。
大多数系统不使用纯ASCII。他们使用其他一些字符集。几乎所有其他字符集都匹配从0到127的值的ASCII,但它们定义了更高值的附加字符和控制代码。
在某些C和C ++实现中,char
对应于一个带符号的char,它可以取值-127到+127(在大多数情况下从-128到+127)。在其他实现中,char
是从0到255的无符号值。
如果你有一个带有负值的签名char
并尝试打印它,那么该库会将其视为unsigned char
(例如,-1变为255),它将打印任何一个字符在平台的字符集对应于该值。如果没有为特定值分配字符,库可能会选择显示一些默认的占位符字符,如问号或框。
答案 3 :(得分:0)
字符在内部被解释为“无符号”。因此,它将是255 - 16 =第239个字符。屏幕控制台上打印了订单239的ascii值。类似地,-43是212阶。
答案 4 :(得分:0)
%c
格式化将始终打印一个字符,因此可能只需要取出char
的位并将其视为无符号值,最终会设置最高位。您的终端可能会将这些字符显示为空白或带有问号的占位符,但我的节目显示Õ和ð...
如果您想在值为负数时不打印,则需要检查它(并使用更大的数据类型,例如int
,以便您可以将非char值与所有值一起使用可能的字符,或signed char
如果您希望确定您是签名类型;普通char
可以是签名或未签名的。
答案 5 :(得分:0)
您可以参考ASCII table。并且所有数字都应映射到(256+(值))%256(这是处理overflows的方式)。您应该能够找到打印哪个符号的数字。