ASCII TABLE - 负值

时间:2012-10-31 15:17:31

标签: c char ascii

  

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

我一无所获。

6 个答案:

答案 0 :(得分:4)

以下是C 2011 standard

中指定的行为

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的方式)。您应该能够找到打印哪个符号的数字。