难道ANSI C支持无/有符号位域?(Does ANSI C support signed / un

2019-07-20 06:29发布

是否有意义晋级位字段符号/无符号?

Answer 1:

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

位域应具有类型_Bool是一个合格的或不合格的版本,符号整数,无符号整型,或其他一些实现定义的类型。



Answer 2:

是。 从一个例子在这里 :

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;

只有你知道,如果它在你的项目是有意义的; 通常,它为与多于一个的比特字段,如果该字段可以有意义地是负的。



Answer 3:

它作为符号或无符号资格的变量是非常重要的。 编译器需要知道如何比较和铸造过程中把你的变量。 检查此代码的输出:

#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,它被解释为负一。

扩大关于这一主题,一个无符号的2张比特数的范围为0至3,而有符号的比特数的范围为-2至1。



Answer 4:

我不认为安德鲁在谈论单比特位字段。 例如,4位字段:数值信息3个比特,一个比特用于符号。 这完全是有意义的,虽然我承认未能拿出了我的头顶,这样的情景。

更新:我不是说我不认为对多位位域(有使用他们所有的时间回来为2400bps调制解调器天压缩数据尽可能地进行传输)一个使用的,但我想不出为符号位领域,特别是没有一个古朴,明显的,这将是对读者的“啊哈”时刻使用。



Answer 5:

肯定ANSI-C提供了符号和无符号位字段。 这是必需的。 这也是写调试器叠加为IEEE-754浮点类型的一部分[[1] [5] [10]],[[1] [8] [23]],和[1] [10] [53] ]。 这是发送通过链路,如视频卡纹理之前在机器类型或这些数据的网络的翻译,或双重检查转换(数学64位)到半精度(对于压缩16位)是有用的。

// Fields need to be reordered based on machine/compiler endian orientation

typedef union _DebugFloat {
   float f;
   unsigned long u;
   struct _Fields {
        signed   s :  1;
        unsigned e :  8;
        unsigned m : 23;
      } fields; 
   } DebugFloat;

埃里克



Answer 6:

是的,它可以。 C位字段基本上只是有限范围的整数。 常见的硬件接口,在这样的客场收拾位在一起,一些控制可以从,说去,-8〜7,在这种情况下,你想一个签位字段,或者从0到15,在这种情况下,你想要一个无符号的比特领域。



Answer 7:

一个地方签位域是有用的是仿真,其中模拟机有比您的默认文字较少的比特。

目前,我在看模拟一个48位的机器,我试图找出如果它是合理使用48位出一个64位的“长长”通过位字段...生成的代码是一样的,如果我做了所有的屏蔽,符号扩展等明确,但它会读好了很多...



Answer 8:

根据该参考文献,这是可能的:
http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=/com.ibm.vacpp6m.doc/language/ref/clrc03defbitf.htm



Answer 9:

位屏蔽符号类型从硬件平台到硬件平台,由于它可能会如何处理来自移位等溢出变化

任何一半好QA工具将明知这种用法的警告。



Answer 10:

如果是“位”是有符号的,则具有一定范围的-1,0,1,然后成为三元数字。 我不认为该标准的缩写将是合适的位置,但对于做有趣的对话:)



文章来源: Does ANSI C support signed / unsigned bit fields?