题目是这样的:求它的结果?
#include<iostream>
#include<string.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
typedef struct AA
{
int b1:5;
int b2:2;
}AA;
void main(){
AA aa;
char cc[100];
strcpy(cc, "0123456789");
memcpy(&aa, cc, sizeof(AA));
std::cout << aa.b1 <<std::endl;
std::cout << aa.b2 <<std::endl;
}
首先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
经过strcpy和memcpy后,aa的4个字节所存放的值是:
0,1,2,3的ASC码,即00110000,00110001,00110010,00110011
所以,最后一步:显示的是这4个字节的前5位,和之后的2位
分别为:10000,和01
因为int是有正负之分 所以:答案是-16和1
上面的是网上给出的解释,但是最后一步是让我纠结的主要原因,过了两天,无意中我想到了计算机的存储方式———“补码”
http://baike.baidu.com/view/377340.htm
,我们得把这个10000转换为补码的真值,若要得到一个负二进制数(符号位为1)的绝对值(称为真值),只要各位(包括符号位)取反,再加1,就得到真值。最后得到-16.
这样的面试题真不简单