我认为在ISO/IEC 9899:TC3 C standard的第6.2.6.2节中描述整数类型的符号位有错误
对于有符号整数类型,对象表示的位应分为三组:值位,填充位和符号位 . 不需要任何填充位;应该只有一个符号位 . 作为值位的每个位应具有与相应无符号类型的对象表示中的相同位相同的值(如果有符号类型中有M个值位且无符号类型中有N,则M≤N) . 如果符号位为零,则不应影响结果值 . 如果符号位为1,则应以下列方式之一修改该值:符号位0的相应值被否定(符号和幅度);符号位的值为 - (2 ^ N)(二进制补码);符号位的值为 - (2 ^ N - 1)(补码)
在上一节中,N被定义为有符号类型中的值位数,但这里是无符号类型中的值位数 .
以每字节8位和2位补码的 signed char
为例,这表示符号位的值为 - (2 ^ 8)= -256而不是 - (2 ^ 7)= -128 .
我认为标准应该在初始段落中切换M和N,或者更改符号位的定义以使用M:
符号位的值为 - (2 ^ M)(二进制补码);符号位的值为 - (2 ^ M - 1)(补码)
我错过了什么,或者这是一个错误?
1 回答
在C11 draft standard(Jonathan Leffler确认最终标准也包含这个措辞)它确实从使用
N
切换到使用M
:我找不到缺陷报告,但这取决于是否:
来自
1
段也适用于2
段,这不是一个不合理的解释,它只是非常含糊不清: