C中的位字段。解释S.a和S.b的值

时间:2012-09-27 07:45:39

标签: c

考虑以下代码

#include<stdio.h>
#include<conio.h>

struct mystruct
{
    int a:1;
    int b:2;
    int c:3;
};

void main()
{
    struct mystruct S;
    clrscr();
    S.a=1;
    S.b=-5;
    S.c=100;
    printf("%d %u %d %u %d %u",S.a,S.a,S.b,S.b,S.c,S.c);
    getch();
}

2 个答案:

答案 0 :(得分:2)

您正在定义1位有符号数a。这没有多大意义,因为一旦标志被编码,就没有任何东西留给任何东西。小位域通常应为unsigned类型,宽度为1的字段必须为,然后您可以存储0或1,这可能就是您的意思。

同样的问题发生在b成员上,它只有两位宽,但你试图存储-5,它实际上不会很容易地编码为两位。

答案 1 :(得分:0)

语句S.b = -5S.c = 100会导致溢出(因为您指定的值不能保存在2位或3位),因此Sb和Sc不会包含您期望的值到。