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

时间:2020-03-06 14:53:14  来源:igfitidea点击:

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

解决方案

如果对一个"位"进行了签名,则范围为-1、0、1,然后成为三进制数字。我认为在此不适合使用标准缩写,但可以进行有趣的对话:)

我不认为安德鲁在谈论单位比特字段。例如,4位字段:3位数字信息,一位符号。尽管我承认无法提出这样的方案,但这完全是有道理的。

更新:我并不是说我无法想到多位位域的用途(在2400bps调制解调器时代一直都使用它们来尽可能多地压缩数据以进行传输),但是我想不到签名位字段的使用,特别是不是古朴的字段,对于读者来说显然是一个"啊哈"时刻。

是的,它可以。 C位字段本质上只是有限范围的整数。通常,硬件接口将位打包在一起,以便某些控制可以从-8到7,在这种情况下,我们确实需要有符号的位域,或者从0到15,在这种情况下,我们需要无符号的位-场地。

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

A bit-field shall have a type that is a qualified or unqualified
  version of _Bool, signed int, unsigned int, or some other implementation-defined
  type.

是的。来自此处的示例:

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;

只有我们知道在项目中是否有意义;通常,如果该字段可以有意义地为负数,则它适用于多于一位的字段。

根据此参考,有可能:
http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=/com.ibm.vacpp6m.doc/language/ref/clrc03defbitf.htm

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

#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;
}

输出:

s: -1    u: 1
s>0: 0   u>0: 1

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

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

由于平台掩码如何处理移位等引起的溢出,因此位掩码签名类型因平台硬件而异。

任何一半好的质量检查工具都将在知情的情况下发出警告。