结构字段问题
struct bit
{
int a:3;
int b:2;
int c:3;
};
int main()
{
bit s;
char *c=(char*)&s;
*c=0x99;
cout<<s.a<<endl<<s.b<<endl<<s.c<<endl;
}
输出为 1 -1 -4
看了内存:10011001 为什么会输出这样的结果
[解决办法]
3个位域正好挤在一个字节里, 1001 1001,
a是001,b是11,c是100,因为是int有符号,所以a是1,b是-1,c是-4.
注意位域无字节序,比特序通常由低到高排列(可能存在从高到低排列),符号位与定义时的类型相同,这里是int。
[解决办法]
没有什么奇怪的呀.
2位2进制数 11 被解释成-1
3位2进制数 100 被解释成-4。
不过,位域最好不要定义成带符号类型,改成下面的定义,输出为1,3,4,是不是容易理解了?
#include <iostream>using namespace std;struct bit{unsigned long a:3;unsigned long b:2;unsigned long c:3;};int main(){bit s;char *c=(char*)&s;*c=0x99;cout<<s.a<<endl<<s.b<<endl<<s.c<<endl;}
[解决办法]
struct bit
{
int a:3;
int b:2;
int c:3;
};
等价于
struct bit
{
signed int a:3;
signed int b:2;
signed int c:3;
};
不等价于
struct bit
{
unsigned int a:3;
unsigned int b:2;
unsigned int c:3;
};
[解决办法]
1. int 是有符号位的
2. 位域的从 char 的 MSB开始还是 LSB开始 依赖编译器