S:赋值前(before assignment):s is ffffffc9尾数c9不是固定的,根据源代码的组织不同,可能影响到内存分配从而造成区别。编译中出现过69、89和c9,但是前边的ffffff是固定的。
可以看到虽然struct bit中只有3+2+3 == 8 个比特位, 但是还是占用了4个字节 ,共32个比特位(但是这不影响用一个char指针就给他们三个赋值,因为他们三个占用的一个字节在整个struct bit中的地址最小( 大端 ),char指针正好指向那个地址)。 由于改进了实验代码,可以直接从结果看出,struct bit中低8位是被赋值0x99了, 但是 高24位 被 缺省 弄成0xffffff了 ,这是从 整个struct bit声明时就存在的。从现在看,无法撼动!!! 特例:除非用指针改——比如*(c+1) = 0x00,手贱的我还是试了,用 *(c + 1) = 0x00;不成功。怀疑有保护, 不过因为已经证实前边的那堆default产生的ffffff对结果没影响,暂时也就没必要深究了。 s.a,s.b,s.c分别占用几个bit位,就按几个bit位算,不干前边的事。想想也是,那样的话也太悲剧了吧,头一个比特变量(比如s.a)永远受前边影响(s.c:1111 1111 1111 1111 1111 1111 110),没法算准,特例之中还有特例,用std::cout来操作s.a,s.b,s.c是没事了,但是用其他 不匹配的指针操作, 例如 : - printf("before assignment : s is %x\n",*c);
- printf("s.a:%x\ns.b:%x\ns.c:%x\n",s.a,s.b,s.c);
的打印结果:
ffffff99
s.a:1
s.b:ffffffff
s.c:fffffffc
|