将位字段限定为有符号/无符号是否有意义?
标准的相关部分(ISO/IEC 9899:1999)是6.7.2.1#4:
位字段的类型应为_Bool,signed int,unsigned int或其他实现定义类型的限定或非限定版本.
是.这里的一个例子:
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;
只有你知道你的项目是否有意义; 通常情况下,如果字段可以有意义地为负,则它适用于具有多个位的字段.
将变量限定为有符号或无符号非常重要.编译器需要知道在比较和转换过程中如何处理变量.检查此代码的输出:
#includetypedef 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.