c-当值在有符号int的正范围内时,有符号int和无符号int总是二进制的吗示例中使用了



char 类型,但问题与任何整数类型有关

我能确定吗signed char foo = 127;将始终是二进制的unsigned char foo = 127;以便在不需要MSB的情况下,可以使用签名变体来表示原始字节?

如果存在填充位,表示值的位不一定相同,但如果没有填充位,则表示值的位数相同。

C 2018 6.2.6.2 2关于有符号整数类型的说明:

作为值位的每个位应具有与对应无符号类型的对象表示中的相同位相同的值…

因此,有符号整数类型中的值位与相应无符号类型中的数值位相同。这就剩下三组比特需要考虑:

  • 符号位
  • 无符号类型而非有符号类型的值位
  • 填充位

符号位必须为零,因为这段话还说:

…如果符号位为零,则不会影响结果值。如果符号位为1,则应通过以下方式之一修改该值:…

如果值不为零,这些"以下方式"(符号和幅度、一的补码、二的补码(都会导致负值。由于我们被告知表示的值是正的,它不是负的,因此符号位必须为零。(我们应该注意的是,这个问题断言值是正的,因此不包括零。对于符号和幅度或一的补码,零可以用符号位1表示,因此它可以与无符号整数零具有不同的位,无符号整数0具有所有零位。(

中存在于无符号类型中但不存在于有符号类型中的任何值位都必须为零,因为这两种类型中的值都相同。

这就留下了填充位,而这正是通信失败的地方。填充位的值不是由C标准指定的,因此在有符号类型和无符号类型之间,或者甚至在同一类型中具有相同值的两个实例之间可能不同。特定的C实现当然可以定义其填充位,使得具有相同值的有符号类型和无符号类型总是具有相同的填充位,并且填充位在有符号类型与无符号类型之间对应。(我们可以想象,有符号类型中的符号位对应于无符号类型的填充位,而不是值位。(

C 1999的措辞相同。

相关内容