读书人

结构字段有关问题

发布时间: 2012-06-12 14:21:25 作者: rapoo

结构字段问题
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,是不是容易理解了?

C/C++ code
#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开始 依赖编译器

读书人网 >C++

热点推荐