ANSI C是否支持有符号/无符号位字段?

14 c struct bit-fields

将位字段限定为有符号/无符号是否有意义?

Chr*_*ung 14

标准的相关部分(ISO/IEC 9899:1999)是6.7.2.1#4:

位字段的类型应为_Bool,signed int,unsigned int或其他实现定义类型的限定或非限定版本.

  • 我认为问题是询问ANSI C(c89/c90)而不是ISO C(c99). (2认同)

tzo*_*zot 8

是.这里的一个例子:

struct {
  /* field 4 bits wide */
  unsigned field1 :4;
  /*
   * unnamed 3 bit field
   * unnamed fields allow for padding
   */
  unsigned        :3;
  /*
   * one-bit field
   * can only be 0 or -1 in two's complement!
   */
  signed field2   :1;
  /* align next field on a storage unit */
  unsigned        :0;
  unsigned field3 :6;
}full_of_fields;
Run Code Online (Sandbox Code Playgroud)

只有你知道你的项目是否有意义; 通常情况下,如果字段可以有意义地为负,则它适用于具有多个位的字段.


小智 7

将变量限定为有符号或无符号非常重要.编译器需要知道在比较和转换过程中如何处理变量.检查此代码的输出:

#include <stdio.h>

typedef struct
{
    signed s : 1;
    unsigned u : 1;
} BitStruct;

int main(void)
{
    BitStruct x;

    x.s = 1;
    x.u = 1;

    printf("s: %d \t u: %d\r\n", x.s, x.u);
    printf("s>0: %d \t u>0: %d\r\n", x.s > 0, x.u > 0);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

s: -1    u: 1
s>0: 0   u>0: 1
Run Code Online (Sandbox Code Playgroud)

编译器使用单个位1或0存储变量.对于有符号变量,最高有效位确定符号(高值被视为负值).因此,有符号变量,当它以二进制形式存储为1时,它被解释为负数.

扩展此主题,无符号两位数的范围为0到3,而带符号的两位数的范围为-2到1.


wor*_*ad3 -4

如果一个“位”被签名,那么你的范围是-1,0,1,然后它变成一个三进制数字。我认为标准缩写不适合这里,但可以进行有趣的对话:)

  • 实际上,从单个位中你只能得到两种状态(如果你理解二进制补码算术的话,这并不奇怪),那就是 0 和 -1。 (3认同)