【发布时间】: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