诡异输出。。高手进

来源:百度知道 编辑:UC知道 时间:2024/05/14 03:06:51
union U
{
struct S
{
unsigned char a : 3;
unsigned char b : 3;
unsigned char c : 2;
}s;

unsigned char c;
};

int main( )
{
U u;
u.c = 100;
cout << (int)u.s.c << endl;
}
输出1耶
unsigned char是位吗?。。如果是这样的话,再把那个东东倒装就可以得出结果。

bit field可以有很多种实现。尤其是不同的平台。没有固定标准。

在你的电脑上bit field 里面的变量在内存里面的顺序和声明时的顺序是相反的。
声明时是a, b, c,实际在内存中的顺序是c, b, a。
其中c - 3bit, b - 3bit, a - 2bit。

然后你再看看下面的例程就应该明白了。

#include <iostream>

using namespace std;

union U
{
struct S
{
unsigned char a : 3;
unsigned char b : 3;
unsigned char c : 2;
}s;

unsigned char c;
};

int main( )
{
U u;
u.c = 100;
// 0x64
// 0110 0100
// c b a
// 01 100 100
cout << (int)u.s.c << endl;

// helps you understand the reverse order of a, b, c in memory.

u.s.a = 0;
u.s.b = 0;
u.s.c = 1;
// c b a
// 01 000 000
// 0100 0000
// 0x40
// ascii @
cout << u.c << endl;

u.s.a = 1;
u.s.b = 0;
u.s.c = 0;
// c b a
// 00 000 001
// 0000 0001
// 0x01