Chr*_*ung 14
标准的相关部分(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;
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,然后它变成一个三进制数字。我认为标准缩写不适合这里,但可以进行有趣的对话:)