【问题标题】:Is this a mistake in the definition of the sign bit for integer types in the C standard?这是C标准中整数类型符号位定义的错误吗?
【发布时间】:2015-05-27 05:59:04
【问题描述】:

我认为在ISO/IEC 9899:TC3 C standard 的第 6.2.6.2 节中描述整数类型的符号位存在错误

对于有符号整数类型,对象表示的位应 分为三组:值位、填充位和符号 少量。不需要任何填充位;应该有一个 符号位。作为值位的每个位应具有与 对应的对象表示中的相同位 无符号类型(如果有符号类型中有 M 个值位,并且有 N 个 无符号类型,则 M ≤ N)。如果符号位为零,则不应 影响结果值。如果符号位为 1,则该值应为 通过以下方式之一进行修改:

  • 符号位为0的对应值取反(符号和幅度);
  • 符号位的值为 -(2^N)(二进制补码);
  • 符号位的值为 -(2^N - 1)(反码)

在上一节中,N 被定义为有符号类型中值的位数,但这里是 无符号 类型中的值位数。

signed char 为例,每个字节有 8 位和二进制补码,这表示符号位的值是 -(2^8) =-256 而不是 -(2^7) = -128。

我认为标准应该要么在开头段落中切换M和N,要么将符号位的定义更改为使用M:

  • 符号位的值为 -(2^M)(二进制补码);
  • 符号位的值为 -(2^M - 1)(反码)

我是否遗漏了什么,或者这是一个错误?

【问题讨论】:

  • 最慈善的(就意图而言可能是正确的)解释可能是第 1 段中 N 的第一个定义旨在适用于整个部分, except 用于第 2 段中的括号注释,其中 N(和 M)暂时被赋予不同的定义。但是,是的,它充其量只是有点模棱两可。归咎于英语的变量范围规则如此糟糕。

标签: c standards language-lawyer


【解决方案1】:

C11 draft standardJonathan Leffler 确认最终标准也包含此措辞)确实从使用N 切换到使用M

  • 符号位的值为 -(2M)(二进制补码);
  • 符号位的值为 -(2M - 1)(反码)。

我找不到缺陷报告,但这取决于是否:

如果有N个值位

1 段也适用于2 段,这不是一个不合理的解释,它只是高度模棱两可:

(如果有 有符号类型有 M 个值位,无符号类型有 N 个值位,则 M

【讨论】:

  • 感谢您的精彩回答。但我认为只有我们程序员会认为 N 的第二个定义仅在括号内隐藏第一个 :)
  • 最终的 C11 标准也使用 -(2^M) 和 -(2^M-1)。
猜你喜欢
  • 1970-01-01
  • 2011-06-19
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 2016-01-19
  • 1970-01-01
相关资源
最近更新 更多