首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于存储单元~该如何处理

2014-04-23 
关于存储单元~~~~求输出结果:typedef struct bitstruct{ int b1:5 int :2 int b2:2 }bitstruct void m

关于存储单元~~~~
求输出结果:
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、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!

热点排行