【问题标题】:Value of character constants in CC中字符常量的值
【发布时间】:2020-12-07 19:24:51
【问题描述】:

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

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

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

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

【问题讨论】:

  • 能否提供整篇文章的链接?
  • 你可以在 C11 标准的 6.4.4.4 的第 10 段找到它。
  • 你想做什么?
  • 我试图理解这些段落的确切含义。也许那里有一些我们无法理解的意图,有经验的人会来解释它,我们可以学到非常有趣的东西。在示例 2 中,他们将整数字符常量 '\xFF' 中的十六进制数视为 char 对象表示的纯二进制解释,这对我来说有点有趣。

标签: c language-lawyer c11


【解决方案1】:

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

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

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

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

【讨论】:

  • 基本上这是几个语言缺陷在不洁的混乱中碰撞的一个例子。 int 类型字符常量、impl.defined char 符号、允许除 2 的补码以外的其他符号形式的语言、各种混乱的隐式提升规则……这些都是其他语言已经修复的缺陷。
猜你喜欢
  • 2013-05-08
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多