关于存储单元~~~~
求输出结果:
typedef struct bitstruct{
int b1:5;
int :2;
int b2:2;
}bitstruct;
void main(){
bitstruct b;
memcpy(&b,"EMC EXAMINATION",sizeof(b));
printf("%d,%d\n", b.b1, b.b2);
}
解释:
程序开头不是定义了bitstruct是个位域结构么,b1,b2分别是只占5位和2位的成员.这个结构中成员占据了9位,需要2个字节,考虑到字节对齐的原因,实际占了4个字节,但这不重要,关键是b1,b2只占据了2个字节.因此,我们只关心memcpy(&b,"EMC EXAMINATION",sizeof(b)); 中,'E'和'M'两个字符带来的影响.
'E'的ASCII码是69,对应二进制是01000101.
'M'的ASCII码是77,对应二进制是01001101.
b1占据的正好是'E'的低5位,即00101,对应的十进制正好是5.然后6,7位对应bitstruct的第二个未命名的成员,再是'E'的第8位和'M'的最低位,组成b2,所以b2的值是10.因此最高位是1,所以是负数的补码,对应的负数是-2.
但是:
关于b2:(3)一个位段必须存储在同一存储单元中,不能跨两个单元
一个存储单元一般是8位(1字节),所以上述b2(10)的算法应该是不对的,是不是说存储单元不是8位?
我做题还需要知道存储单元是多大的啊,无语。。
还想问问存储单元和通常说的16/32位机,有没有关系
[解决办法]
存储单元是按总线长度划分的,不是按字节划分的。无论怎么弄,读的时候总是按总线长度读,尽管后面的没用。比如,一个short跨了总线对齐,也是2次总线长度读,然后拼凑到一起。
[解决办法]
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?
不要写连自己也预测不了结果的代码!