为什么前面有个0011
#include <iostream.h>
#include <stdio.h>
typedef struct AA
{
int b1:5;
int b2:2;
}AA;
void main()
{
AA aa;
char cc[100];
strcpy(cc, "0123456789abcdefghijklmnopqrstuvwxyz ");
memcpy(&aa,cc,sizeof(AA));
cout < < aa.b1 < <endl;
cout < < aa.b2 < <endl;
}
答案是 -16和1
首先sizeof(AA)的大小为4,b1和b2分别占5bit和2bit.
经过strcpy和memcpy后,aa的4个字节所存放的值是:
0,1,2,3的ASCII码,即00110000,00110001,00110010,00110011
所以,最后一步:显示的是这4个字节的前5位,和之后的2位
分别为:10000,和01
因为int是有正负之分 所以:答案是-16和1
[解决办法]
"0 "的ascii码是0x30,表示成2进制就是00110000。 "1 "的ascii码是0x31,表示成2进制是00110001。前面当然都有有0011。注意,你做strcpy拷到cc里的是字符 '0 ', '1 ', '2 '.....不是数字0,1,2.....
[解决办法]
从0到9的十个数字的ASCII码前四位都是0011
[解决办法]
0x30 ~ 0x39
注意 16进制和 2进制转换方式:
3 ~ 0011
[解决办法]
不同的cpu得到的值应该不同吧?
--------------
嗯?跟cpu关系不大吧,跟系统的编码方式直接相关。
比如VM/SP上用EBCDIC码的操作系统,不用Ascii码,得到的值就不一样了。
现在见到的大多数系统都是用Ascii码的,看做是一样的也多半不会错了。呵呵~
[解决办法]
都被前面的大侠说完了,我再来补充一下那个-16
C,汇编中对负数使用补码存储的方式,所以
b1 = 10000
因为最高位为1,表示是负数,所以需要对10000进行补码变换(先反码再加1)
结果就是-16了