1,x86编译使用 Little Endian(MSDN上关于位域的示例代码明确标识使用 /LD 编译选项),;
2,enum 的类型为 int ,是有符号的;
3,type 字段处在内存布局的高位;
4,设置为 2 后,二进制表示为 10,那么 RenderState 的最高位就是 1,就是负数,负数用补码运算,实际值取反加 1,就是 1 + 1 = 2,然后再取符号位为负数,就是 -2。
_s.s.type的二进制是10 ,如果要和四字节Char进行比较的话,就要进行转换,那么对于一个单纯的二进制来说,转换就只能最高位进行符号扩展,10会转换成四字节的fffffffe,即-2, 同理如果_s.s.type=Float的话,会会转换成四字节的ffffffff.
因为C++是强类型的语言,所以处处要有"类型"思维
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
要怎麽分析怎麽分析這個結果,前面幾位都有説明。