一道让我纠结了几天的面试题

 题目是这样的:求它的结果?

#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
 
 上面的是网上给出的解释,但是最后一步是让我纠结的主要原因,过了两天,无意中我想到了计算机的存储方式———“补码 http://baike.baidu.com/view/377340.htm ,我们得把这个10000转换为补码的真值,若要得到一个负二进制数(符号位为1)的绝对值(称为真值),只要各位(包括符号位)取反,再加1,就得到真值。最后得到-16.
这样的面试题真不简单
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值