#include <iostream>
using namespace std;
#include <vector>
typedef struct  AA
{
int b1:5;
int b2:2;
}AA;AA aa;int main()
{
char cc[100];
strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");
memcpy(&aa,cc,sizeof(AA));
 
cout << aa.b1 <<endl;
cout << aa.b2 <<endl;
printf("d=%d\n",sizeof(AA));
return 0;
}
我知道b1是10000,但我就是不明白为什么是-16,求高手帮忙

解决方案 »

  1.   

    这跟编译器如何解释struct中的位域有关。楼主不必太在意这些非C++的标准定义的实现细节。不同的编译器可能有不同的结果。楼主只需要遵循标准c++就行了。
      

  2.   

    道理其实不难的,最高位是1时,就是负数.5位的位域,10000,最高位就是1了,所以是负的.举例 8 位的 signed ,10000000b 是 -128 , 01111111 是 127 范围是 -128 ~ +127
        7      signed , 1000000b 是 -64  ,  0111111 是 63 范围是   -64 ~ +63
        6                                                        -32 ~ +31
        5                                                        -16 ~ +15
    ...
    ...
    ...
        2                    10b    -2                           -2 ~ 1
        1 位的 signed ,        1b 是 -1   ,        0 是 0          -1 ~ 0
        
      

  3.   

    C++ Primer 有介绍位域的,可以去看看.
    如果一个5位的有域号数,10000不是-16,而是32,那反而当了他是unsigned的了.