这是C标准中整数类型的符号位定义中的错误吗?

Pau*_*kin 5 c standards language-lawyer

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

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

  • 符号位0的相应值被否定(符号和幅度);
  • 符号位的值为 - (2 ^ N)(二进制补码);
  • 符号位的值为 - (2 ^ N - 1)(补码)

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

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

我认为标准应该在初始段落中切换M和N,或者更改符号位的定义以使用M:

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

我错过了什么,或者这是一个错误?

Sha*_*our 6

C11标准草案中(Jonathan Leffler确认最终标准也包含此措辞)它确实从使用N转为使用M:

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

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

如果有N个值位

从段落1也适用于2不是不合理解释的段落,它只是非常含糊不清:

(如果有符号类型中有M个值位且无符号类型中有N,则M <= N)