当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《ANSIC是否支持有符号/无符号位字段?》经验,为你挑选了3个好方法。

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



1> Chris Young..:

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

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


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

2> tzot..:

是.这里的一个例子:

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;

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



3> 小智..:

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

#include 

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.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有