intel 面试题

sara0209 2008-09-07 02:09:39
1.在P4的机器上,下段代码的输出结果是什么:
#include <stdio.h>
struct{
int a:3;
int b:2;
int c:3;
}s;
void main(void)
{
char *p;
p=(char*)&s;
*p=0x99;
printf("%d\n",*p);
printf("%d,%d,%d",s.a,s.b,s.c);
}
学习中,能详细说明为什么吗?谢谢各位大虾!
...全文
345 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sara0209 2008-09-07
  • 打赏
  • 举报
回复
谢谢楼上!
_石头_ 2008-09-07
  • 打赏
  • 举报
回复
00X99= 1001 1001
最高位为1----表示是符数,其余的位数取反+1就等于有效值
所以
1001 1001=-(1100110+1)=-1100111=-103

其实位域的算法也是这样,只是BIT位的数量是位域成员指定的宽度而已
sara0209 2008-09-07
  • 打赏
  • 举报
回复
再弱弱问句:-103怎么来的
fflush 2008-09-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 baihacker 的回复:]
引用 6 楼 sara0209 的回复:

我运行出来是
-103
1 -1 -4
不懂~~~~
是不是要涉及类型转换哦

见我一楼说的...有符号是先左移再算术右移以保持符号
比如占两位,则先左移30位,这时候符号位就在最高位了,然后再算术右移30位,这个时候就会保持这个符号
11左移30位后由于最高位是1,然后算术右移,移了后由于最高位是1,所以再填充.于是结果就出来了.
100
001
同理.
[/Quote]

baihacker的解释很有意思,一般的逻辑应该是这样的,比方说s.c是100,但是编译器需要把这个值解释成一个int类型,而后者是32位的,所以要把s.c扩展到32位,对于这种扩展,计算机中有两种方式,即符号扩展和无符号扩展,符号扩展就是把需要扩展的位用符号位来填充,而无符号扩展就是用0来填充。int型当然是有符号的,这里做了一个符号扩展,所以s.c变为0xFFFFFFFC,即-4。

至于为什么会有符号扩展这种莫名其妙的方式,Lz可以看一下补码的表示方法,仔细研究之后你就会知道符号扩展是唯一正确的方式
_石头_ 2008-09-07
  • 打赏
  • 举报
回复
有符号的,我是这样人为地------和常规类型的有符号数一样,只是bit位少些!
譬如:如果s的成员是int形
c b a
1 0 0 1 1 0 0 1

s.a=1;
s.b=-1
s.c=-4
分析,以s.c为列
s.c共3bit,所以它的-1的形式为 111,如果S.C不等于-1,那么 -1^S.C就等于的S.C绝对值
sara0209 2008-09-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 baihacker 的回复:]
引用 6 楼 sara0209 的回复:
我运行出来是
-103
1 -1 -4
不懂~~~~
是不是要涉及类型转换哦

见我一楼说的...有符号是先左移再算术右移以保持符号
比如占两位,则先左移30位,这时候符号位就在最高位了,然后再算术右移30位,这个时候就会保持这个符号
11左移30位后由于最高位是1,然后算术右移,移了后由于最高位是1,所以再填充.于是结果就出来了.
100
001
同理.
[/Quote]
谢谢 我大概知道怎么回事了
_石头_ 2008-09-07
  • 打赏
  • 举报
回复
高低地址弄反了
[Quote=引用 3 楼 CSYNYK 的回复:]
这是intel的面试题?----不会把?
按照内存格式排布一下就出来了啊!
c    b    a
1 0 0  1 1  0 0 1

s.a=1;
s.b=3
s.c=4

[/Quote]
这个是unsigned int 的结果
baihacker 2008-09-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sara0209 的回复:]
我运行出来是
-103
1 -1 -4
不懂~~~~
是不是要涉及类型转换哦
[/Quote]
见我一楼说的...有符号是先左移再算术右移以保持符号
比如占两位,则先左移30位,这时候符号位就在最高位了,然后再算术右移30位,这个时候就会保持这个符号
11左移30位后由于最高位是1,然后算术右移,移了后由于最高位是1,所以再填充.于是结果就出来了.
100
001
同理.
sara0209 2008-09-07
  • 打赏
  • 举报
回复
我运行出来是
-103
1 -1 -4
不懂~~~~
是不是要涉及类型转换哦
hyyuanqiang 2008-09-07
  • 打赏
  • 举报
回复
呵呵呵


intel不会考这么容易的题目吧???
_石头_ 2008-09-07
  • 打赏
  • 举报
回复
噢!是int型的阿?那就好考虑符号!
_石头_ 2008-09-07
  • 打赏
  • 举报
回复
这是intel的面试题?----不会把?
按照内存格式排布一下就出来了啊!
a b c
1 0 0 1 1 0 0 1

s.a=4;
s.b=3
s.c=1
过去的我 2008-09-07
  • 打赏
  • 举报
回复
intel没有笔试的,lz又在yy了
baihacker 2008-09-07
  • 打赏
  • 举报
回复
位域以及对于int位域中符号位的保留问题.

关键是符号位,如果不需要符号,只要一个右移,再一个&就OK

如果需要保留符号位,要先左移,再算术右移

70,037

社区成员

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

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