ASCII 表 - 负值

wan*_*arn 4 c ascii char

可能重复:
负 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)

我什么也得不到。

Joh*_*ode 5

这是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 字符。


Som*_*ude 3

这是因为-16与十六进制相同,而十六0xf0进制与 相同240。在我的字符集 (ISO 8859-1) 中,该字符是 LATIN SMALL LETTER ETH'\xc3\xb0'

\n