形如int x:1;int x:2;int x:32

时间:2022-12-20 02:40:00
#include<iostream>
#include <bitset>
using namespace std;
struct a{
    int x:1;
    int y:2;
    int z:32;
};
int main()
{
    a d;
    d.x=8;
    d.y=8;
    d.z=6;
    cout<<bitset<sizeof(int)*8>(d.x)<<endl;
    cout<<bitset<sizeof(int)*8>(d.y)<<endl;
    cout<<bitset<sizeof(int)*8>(d.z)<<endl;
    printf("%d %d %d %d",d.x,d.y,d.z,sizeof(d));
    return 0;
}

我们首先分析显示,当均赋值为0时,均不超过位数限制所以输出正确。
当赋值为0时
形如int x:1;int x:2;int x:32
当赋值为1时
形如int x:1;int x:2;int x:32
当赋值为2时
形如int x:1;int x:2;int x:32
当赋值为3时
形如int x:1;int x:2;int x:32
当赋值为4时
形如int x:1;int x:2;int x:32
当赋值为5时
形如int x:1;int x:2;int x:32
继续进行赋值的话会发现:
对x来说,当数值的二进制形式的右边第一位为1时,输出-1,为0时,输出0;
对y来说,当数值的二进制形式的右边第二位为1时,其左边均为1,为0时其左边均为0,与第一位的数值无关,因而可能会出现的值为-2,-1,0,1四种情况;

接下来我们分析一下sizeof(d)的大小
int x:1;//x:l
int y:2;//x:m
int z:32;
z占4个字节,
当l+m<=32时,sizeof(d)为8;
当l+m>32时,sizeof(d)为12;