首页 新闻 赞助 找找看

c++位域 溢出

1
悬赏园豆:100 [待解决问题]

void test()
{
enum Type
{
Int = 1,
Char,
Float,
};

union RS
{
struct RenderState
{
Type type : 2;
unsigned char data : 6;

}s;
unsigned char u;
};

RS _s;
_s.u = 0;
_s.s.type = Char;
assert(_s.s.type == (Type)Char); // 这个为啥断言失败了

}

nigoe的主页 nigoe | 初学一级 | 园豆:102
提问于:2013-08-01 20:25
< >
分享
所有回答(3)
0

1,x86编译使用 Little Endian(MSDN上关于位域的示例代码明确标识使用 /LD 编译选项),;

2,enum 的类型为 int ,是有符号的;

3,type 字段处在内存布局的高位;

4,设置为 2 后,二进制表示为 10,那么 RenderState 的最高位就是 1,就是负数,负数用补码运算,实际值取反加 1,就是 1 + 1 = 2,然后再取符号位为负数,就是 -2。

Launcher | 园豆:45045 (高人七级) | 2013-08-02 16:32
0

_s.s.type的二进制是10 ,如果要和四字节Char进行比较的话,就要进行转换,那么对于一个单纯的二进制来说,转换就只能最高位进行符号扩展,10会转换成四字节的fffffffe,即-2,  同理如果_s.s.type=Float的话,会会转换成四字节的ffffffff.

因为C++是强类型的语言,所以处处要有"类型"思维

ForFreeDom | 园豆:589 (小虾三级) | 2013-08-05 17:05
0

struct RenderState
{
//Type

unsigned char type : 2;
unsigned char data : 6;
}s;

 

用這個OK.

 

x86 vc++

struct RenderState
{
Type type : 2;
unsigned char data : 6;
}s;

使用 Type 或 int, 實驗得到如下結果:

RS* p=&_s; //p x0012FE70

_s.u = 0;    // x0012FE70  00 cc cc cc cc cc cc cc cc cc cc cc

 

使用 unsigned char, 實驗得到如下結果:

RS* p=&_s; //p x0012FE70

_s.u = 0;    // 0x0012FE70  cc cc cc cc cc cc cc 00 cc cc cc cc

 

要怎麽分析怎麽分析這個結果,前面幾位都有説明。

mhgu | 园豆:206 (菜鸟二级) | 2013-10-30 17:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册