专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C语言

C面试题,求详解,该怎么解决

发布时间:2011-06-28 16:19:07 文章来源:www.iduyao.cn 采编人员:星星草
C面试题,求详解
C/C++ code

typedef struct{
    int a:2;
    int b:2;
    int c:1;
}Test;
Test t;
t.a = 1;
t.b = 3;
t.c = 1;

printf("%d\n", t.a);
printf("%d\n", t.b);
printf("%d\n", t.c);



结果:1
  -1
  -1

不知道原因,求高手详解

------解决方案--------------------
实际上这就是简单的补码取值范围的事情

a占两位,那么a能表示哪些数呢:
1)00,显然a为0
2)01,显然a为1
3)10,a为负数(因为符号位为1),对10取反加1得到10,这是数值2的二进制表示,也就是说-a是2,所以a为-2
4)11,a为负数(因为符号位为1),对11取反加1得到01,这是数值1的二进制表示,也就是说-a是1,所以a为-1

b同a

c只占1位:
1)0,显然c为0
2)1,c为负数(因为符号位为1),对1取反加1得到1,这是数值1的二进制表示,也就是说-c是1,所以c为-1

再来看问题
a)给a赋值1,没问题,a的两位是01,所以a为1
b)给b赋值3,但是3已经超过了两位所能表示的范围,那么怎么办呢,3的补码是011,后两个11被存入b,0被舍弃,所以b为-1
c)给c赋值1,不行,c的取值只能是0或者-1(见上面的分析),那么怎么办,1的补码是01,1被存入c,0被舍弃,所以c为-1

------解决方案--------------------
符号位扩展:如果位域的最高位为1,你以有符号整数方式打印则符号位扩展为1,输出负数;
否则,符号位扩展为0,输出整数.
t.a: 占2 bit, 01, 符号扩展最高位0, 输出正数;
t.b: 占2 bit, 11, 符号扩展最高位1, 输出负数;
t.b: 占1 bit, 1, 符号扩展最高位1, 输出负数;

事实上,位域通常用无符号数.
typedef struct {
unsigned int a:2;
unsigned int b:2;
unsigned int c:1;
} Test;

------解决方案--------------------
探讨
实际上这就是简单的补码取值范围的事情

a占两位,那么a能表示哪些数呢:
1)00,显然a为0
2)01,显然a为1
3)10,a为负数(因为符号位为1),对10取反加1得到10,这是数值2的二进制表示,也就是说-a是2,所以a为-2
4)11,a为负数(因为符号位为1),对11取反加1得到01,这是数值1的二进制表示,也就是说-a是1,所以a为-1

b同a

c只占1位:
……

------解决方案--------------------
int 是有符号数;
编译器解释有符号数时认为最高位是1的就是负数;
a的二进制是01是正数,正数的补码是它本身,所以输出1;
b的二进制是11 最高位是1,所以是个负数,内存放的都是补码,变换的方法就是先减1,再按位取反,再加个负号就是原值了,11-1=10,10再按位取反就是01,加个负号就是-1;
c的二进制是1也是个负数,减1,按位取反,加个负号就是-1了;



其实所有数值都是以补码的形式储存在内存中,区别在于内存解释上,比如用unsigned int,int,short,long解释;

例如:int m=7;7的补码为0111,那么就直接把0111放进内存m低位中,其它位以符号位0补足;

unsigned int n=-7;-7的补码为1001,把1001放进n低位中,其它以符号位1补足,这里
用无符号数解释内存n,那么执行cout<<n;就会输出11111111 11111111 11111111 11111001
的十进制数;如果用符号数解释即int n=-7;那么就输出-7(11111111 11111111 11111111 11111001原码为10000000 00000000 00000000 00000111,最高位为符号位)

用 = 号赋值就是内存段复制到内存段的操作;

符号‘-’,实际就是按位取反然后加1;例如:-7,意思是把0111按位取反加1得1001;也即
-7的补码
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: