位域的使用

分析一下下面程序的输出结果

  1. #i nclude<iostream.h>  
  2. #i nclude <string.h>  
  3. #i nclude <malloc.h>  
  4. #i nclude <stdio.h>  
  5. #i nclude <stdlib.h>  
  6. #i nclude <memory.h>  
  7. typedef struct AA  
  8. {  
  9.          int b1:5;  
  10.          int b2:2;  
  11. }AA;  
  12. void main()  
  13. {  
  14.         AA aa;  
  15.         char cc[100];  
  16.         strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");  
  17.         memcpy(&aa,cc,sizeof(AA));  
  18.         cout << aa.b1 <<endl;  
  19.         cout << aa.b2 <<endl;  
  20. }  

答案: -16和1
剖析:
"0 "的ascii码是0x30,表示成2进制就是00110000。 "1 "的ascii码是0x31,表示成2进制是00110001。前面当然都有有0011。注意,你做strcpy拷到cc里的是字符 '0 ', '1 ', '2 '.....不是数字0,1,2..... 

sizeof(AA)的大小为4,b1和b2分别占5bit和2bit.
经过strcpy和memcpy后,aa的4个字节所存放的值是:
0,1,2,3的ASC码,即00110000,00110001,00110010,00110011
所以,最后一步:显示的是这4个字节的前5位,和之后的2位
分别为:10000,和01
因为int是有正负之分,所以是-16和1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值