“C语言面试题大汇总“中的疑问

CgPanda_ 2006-07-03 03:25:14
// 帮忙分析一下
#include<iostream.h>
#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,"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的ASC码,即00110000,00110001,00110010,00110011
所以,最后一步:显示的是这4个字节的前5位,和之后的2位
分别为:10000,和01
因为int是有正负之分  所以:答案是-16和1

//==============

前5位为什么是 10000而不是00110,是因为低位在前吗? 为什么是负的呢?第一位是符号位?那不就成零了?
...全文
664 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xinai0521 2006-07-04
  • 打赏
  • 举报
回复
楼主,你这样试一试,cout << *((int *)&aa)<<endl; 你会发现,*((int *)&aa)他的值是:
  0x33323130是这么多,
  他的二进制代码:(高字节)00110011,00110010,00110001,00110000,低字节. 
而位段左到右aa.b1开始取.所10000 就是-16
  同样aa.b2 :01就是1了..

  
    
CgPanda_ 2006-07-04
  • 打赏
  • 举报
回复
楼上的说的不对
CgPanda_ 2006-07-04
  • 打赏
  • 举报
回复
楼上说得有理
xinai0521 2006-07-04
  • 打赏
  • 举报
回复

你结合我说的,你就明白" 前5位为什么是 10000而不是00110,是因为低位在前吗? 为什么是负的呢?第一位是符号位?那不就成零了"为什么是-16 和1了..
xinai0521 2006-07-04
  • 打赏
  • 举报
回复
因为这里内存放问题..memcpy这个函数,低位地址对低位字节,高位地址高位字节,  
  你强类型转化就可以发现,00110011(assic:3),00110010(assic:2),00110001(assic:1),00110000(assic:0)
  而在IBM机器中,数据高位字节在高位地址,低位字节在低位地址.
FreshBird 2006-07-03
  • 打赏
  • 举报
回复
10000 是用5bit补码表示的负数, 负数的补码表示法值=其绝对值取反加1,
16的5bit原码10000, 取反为01111, 加1, 所得为10000
所以-16用5位的补码表示就是10000
CgPanda_ 2006-07-03
  • 打赏
  • 举报
回复
应该是扩展为 1111 1111 1111 1111 1111 1111 1111 0000,32位系统上 4个字节。
CgPanda_ 2006-07-03
  • 打赏
  • 举报
回复
10000 符号位为1,扩展为 1111 0000,这是补码,求原码为1001 0000,即-16,是这样吗?
littlefish1981 2006-07-03
  • 打赏
  • 举报
回复
01为什么就是正的?它高位扩展为0吗?为什么?
===========================================================================
对。就如同char扩展为int一样,都是看符号位的,但如果是无符号的,就用0扩展。
falcon23 2006-07-03
  • 打赏
  • 举报
回复
补码
CgPanda_ 2006-07-03
  • 打赏
  • 举报
回复
在线等
CgPanda_ 2006-07-03
  • 打赏
  • 举报
回复
10000带符号位扩展,高位都扩展为1。
========================
01为什么就是正的?它高位扩展为0吗?为什么?
CgPanda_ 2006-07-03
  • 打赏
  • 举报
回复
怎么判断是负的?
littlefish1981 2006-07-03
  • 打赏
  • 举报
回复
为什么是负的16呢?我还是搞不清楚
========================================================
10000带符号位扩展,高位都扩展为1。
AN_941 2006-07-03
  • 打赏
  • 举报
回复

UP................
CgPanda_ 2006-07-03
  • 打赏
  • 举报
回复
为什么是负的16呢?
我还是搞不清楚
wanderfox 2006-07-03
  • 打赏
  • 举报
回复

0 01 10000
高------>低
wanderfox 2006-07-03
  • 打赏
  • 举报
回复
typedef struct AA
{
int b1:5;
int b2:2;
}AA;
如果这样声明的话,b1应该是最低的5个bit,b2是紧接着的2个bit,把00110000分开看:
0 01 100000 这样就清楚了

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧