可能重复:
负 ASCII 值
int main() {
char b = 8-'3';
printf("%c\n",b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我运行这个程序,我得到一个看起来像问号 (?) 的标志。
我对你的问题是为什么它打印那个而不打印任何东西,因为据我所知,ASCII 表中 b 的值是负 43,这是不存在的。
顺便说一句,当我编译这段代码时:
int main() {
char b = -16;
printf("%c\n",b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我什么也得不到。
这是C 2011 标准中指定的行为
7.21.6.1 fprintf 函数
...
8 转换说明符及其含义是:
...
c如果不存在l长度修饰符,则将int参数转换为unsigned char,并写入结果字符。
如果存在l长度修饰符,则wint_t参数将被转换为好像ls没有精度的转换规范和指向 的二元素数组的初始元素的参数,wchar_t第一个元素包含 的wint_t参数lc转换规范和第二个空宽字符。
-43 被转换为一个无符号值 (213),所以它打印了一个扩展的 ASCII 字符。
这是因为-16与十六进制相同,而十六0xf0进制与 相同240。在我的字符集 (ISO 8859-1) 中,该字符是 LATIN SMALL LETTER ETH或'\xc3\xb0'。