首页 > 解决方案 > C中字符常量的值

问题描述

6.4.4.4/10 ...如果整数字符常量包含单个字符或转义序列,则其值是将具有单个字符或转义序列的值的 char 类型的对象转换为 int 类型时产生的值.

我很难理解这一段。本段标准后给出如下示例:

示例 2:考虑使用二进制补码表示整数和 8 位表示类型为 char 的对象的实现。在 char 类型的值范围与有符号 char 相同的实现中,整数字符常量 '\xFF' 的值为 -1;如果 char 类型的值范围与 unsigned char 相同,则字符常量 '\xFF' 的值是 +255。

我从表达式中了解到:“char 类型的对象的值”是我们在解释 char 类型的对象内容时得到的值。但是当我们看这个例子时,就像用纯二进制符号谈论对象的值一样。我的理解错了吗?对象的值是否总是意味着该对象中的位?

标签: clanguage-lawyerc11

解决方案


所有“整数字符常量”(和之间的东西''都具有int传统和兼容性原因的类型。但它们大多是和 一起使用的char,所以 6.4.4.4/10 需要区分类型。基本上修补损坏的 C 语言 - 我们有诸如*"\xFF"导致 typechar'\xFF'导致 type 的情况int,这非常令人困惑。

'\xFF'= 255 将始终适合int任何实现,但不一定适合char具有实现定义的符号(语言中的另一个不一致)的 a 。转义序列的行为应该就像我们将字符常量存储在 achar中一样,就像在我的字符串文字示例中所做的那样*"\xFF"

char即使值存储在 an中,也需要与类型保持一致,这int是 6.4.4.4/10 所描述的。也就是说,printf("%d", '\xFF');应该表现得像char ch = 255; printf("%d", (int)ch);

该示例描述了一种可能的实现,其中char有符号或无符号并且系统使用 2 的补码。通常整数类型的对象的值是指十进制表示法。char是一个整数类型,所以它可以有一个负十进制值(如果符号表有一个与值 -1 匹配的索引是另一回事)。但是“原始二进制”不能有负值,1111 1111如果你说存储单元应该被解释为8位2的补码,只能说是-1。也就是说,如果您知道签名char存储在那里。如果您知道char那里存储了一个无符号数,则该值为 255。


推荐阅读