4

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

我什么都得不到。

4

6 回答 6

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

于 2012-10-31T15:55:55.693 回答
2

That's because -16 is the same as hex 0xf0 which is the same as 240. In my character set (ISO 8859-1) that character is LATIN SMALL LETTER ETH or 'ð'.

于 2012-10-31T15:34:52.807 回答
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),并且它将打印平台字符集中与该值相对应的任何字符。如果没有分配给特定值的字符,库可能会选择显示一些默认占位符字符,如问号或框。

于 2012-10-31T16:36:39.397 回答
0

打印时字符在内部被解释为“无符号”。因此,它将是 255 - 16 = 第 239 个字符。顺序为 239 的 ascii 值打印在屏幕控制台上。同样 -43 是订单 212。

于 2012-10-31T15:42:13.943 回答
0

格式将%c始终打印一个字符,因此大概它只需要您的位char并将其视为无符号值,最终成为设置最高位的东西。您的终端可能会将这些字符显示为空白或带问号的占位符,但我的终端显示 Õ 和 ð...</p>

如果您想在值为负数时不打印任何内容,则需要检查它(并使用更大的数据类型,例如int以便您可以将非字符值与所有可能的字符一起放置,或者signed char如果您希望确保你得到一个有符号的类型;一个普通的char可能是有符号的或无符号的)。

于 2012-10-31T15:42:22.080 回答
0

您可以参考ASCII 表。并且所有数字都应映射到 (256+(value))%256 (这是处理溢出的方式)。您应该能够找到为哪个数字打印哪个符号。

于 2012-10-31T15:43:59.933 回答