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

这是C标准中整数类型的符号位定义中的错误吗?,c,standards,language-lawyer,C,Standards,Language Lawyer,我认为在第6.2.6.2节中描述整数类型的符号位时出现错误 对于有符号整数类型,对象表示的位应为 可分为三组:值位、填充位和符号 一点不需要任何填充位;应该只有一个 符号位。作为值位的每个位的值应与 对应对象的对象表示中的相同位 无符号类型(如果有符号类型中有M个值位,而有符号类型中有N个值位 无符号类型,然后是M≤ N) 。如果符号位为零,则不应为零 影响结果值。如果符号位为1,则该值应为 通过以下方式之一进行修改: 符号位为0的对应值为负数(符号和幅值) 符号位具有该值−(2^N)(二者的

我认为在第6.2.6.2节中描述整数类型的符号位时出现错误

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

  • 符号位为0的对应值为负数(符号和幅值)
  • 符号位具有该值−(2^N)(二者的补充)
  • 符号位具有该值−(2^N− 1) (一人之补)
在上一节中,N被定义为有符号类型中的值位数,但这里是无符号类型中的值位数

以每字节8位和两个补码的有符号字符为例,这意味着符号位的值为-(2^8)=-256,而不是-(2^7)=-128

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

  • 符号位具有该值−(2^M)(二者的补充)
  • 符号位具有该值−(2^M− 1) (一人之补)
我是否遗漏了什么,或者这是一个错误?

在中(Jonathan Leffler确认最终标准也包含此措辞),它确实从使用
N
切换到使用
M

  • 符号位具有该值−(2M)(二者的补充)
  • 符号位具有该值−(2米− 1) (一人之补)
我找不到缺陷报告,但这取决于是否:

如果有N个值位

从段落
1
也适用于段落
2
,这不是一个不合理的解释,它只是在以下情况下非常模糊:

(如果有
有符号类型中的M个值位和无符号类型中的N个值位,那么M最有益的(就意图而言,可能是正确的)解释可能是,第1段中N的第一个定义适用于整个部分,除了第2段中的附加注释,其中N(和M)暂时给出了一个不同的定义。但是是的,充其量也有点模棱两可。归咎于英语的变量作用域规则太差。谢谢你的回答。但是我认为只有美国程序员才会认为N的第二个定义只会在parens内部隐藏第一个定义:)最终的C11标准也使用-(2^M)和-(2^M-1)。