微软笔试题,看你能否回答?

[复制链接]
4763|22
 楼主| busdriver 发表于 2010-11-3 15:19 | 显示全部楼层 |阅读模式
下面结构体变量在内存中大小?
  struct
  {
    unsigned ADDR:4;//address
    unsigned RESERVEDL:8;//RESERVED 0x0
    unsigned RESERVEDH:4;//RESERVED 0x00
  }B;
 楼主| busdriver 发表于 2010-11-3 15:19 | 显示全部楼层
2字节还是3字节?
 楼主| busdriver 发表于 2010-11-3 15:20 | 显示全部楼层
16位还是24位或者20位?
 楼主| busdriver 发表于 2010-11-3 15:21 | 显示全部楼层
union
        {
                unsigned int R;
                struct
                {
                        unsigned ADDR:4;//address
                        //unsigned RESERVED:12;//RESERVED 0x000
                        unsigned RESERVEDL:8;//RESERVED 0x0
                        unsigned RESERVEDH:4;//RESERVED 0x00
                }B;
        }R5L;//R5 register

共用体大小??
ayb_ice 发表于 2010-11-3 15:47 | 显示全部楼层
这取决于具体的目标编译器,也就是目标CPU
其实就是考虑内存对齐的问题

评分

参与人数 2威望 +5 收起 理由
mxh0506 + 1
McuPlayer + 4 一语中的

查看全部评分

 楼主| busdriver 发表于 2010-11-3 16:11 | 显示全部楼层
兄台言之有理,在下极为佩服!
 楼主| busdriver 发表于 2010-11-3 16:12 | 显示全部楼层
对于位域的定义尚有以下几点说明:
1)   一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存
放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
例如:
struct bs
     {
       unsigned a:4
       unsigned :0        /*空域*/
       unsigned b:4       /*从下一单元开始存放*/
       unsigned c:4
     }
    在这个位域定义中,a 占第一字节的 4 位,后 4 位填 0 表示不使用,b 从第二字节开
始,占用 4 位,c 占用 4 位。
2)   由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说
不能超过 8 位二进位。

请兄台看看这段话。
 楼主| busdriver 发表于 2010-11-3 16:14 | 显示全部楼层
上面这段话出自国内C语言开山大师谭浩强先生著名著作《C语言程序设计》
McuPlayer 发表于 2010-11-3 16:16 | 显示全部楼层
关于位域,在嵌入式设计中应该尽量少用,而用maskbit的方式来代替
不是跨不跨字节的问题,而是不同的编译器会产生不同结果,这种不确定性在设计中才是要避免的
 楼主| busdriver 发表于 2010-11-3 16:16 | 显示全部楼层
谭浩强先生这段话应该是针对通用处理器的吧?

编译器种类繁多,特别是单片机的。贵兄台知道HT PICC支持哪一种位域对齐?
 楼主| busdriver 发表于 2010-11-3 16:18 | 显示全部楼层
加分是否意味自己要减分?
 楼主| busdriver 发表于 2010-11-3 16:18 | 显示全部楼层
不知道?
 楼主| busdriver 发表于 2010-11-3 22:54 | 显示全部楼层
上技术热贴10大了,我甚惶恐啊
 楼主| busdriver 发表于 2010-11-3 22:56 | 显示全部楼层
很多人看,但是甚少人回帖,我甚惶恐啊
 楼主| busdriver 发表于 2010-11-3 22:59 | 显示全部楼层
睡觉了。我甚惶恐啊
highgear 发表于 2010-11-3 23:08 | 显示全部楼层
顶5楼 ayb_ice, 高手。

位域与字节对齐取决于编译器, 以及CPU内存存取方式。实际上, 因为 CPU 内存存取方式决定了编译器的做法, 目的是为了效率。

对于很多8bit CPU, 位域跨两个字节要付出额外的代码来处理;
但是对于一些纯16bit CPU, 则不存在"位域跨两个字节"的限制,代之为“位域跨两个字(16BIT)"的限制;
对于80x86这类cpu, 则复杂很多, 因为历史上8088的缘故, 80x86支持字节存取和操作, 而intel 一直**向下兼容, 这造成对于 32bit数据总线的cpu存取跨32bit的两个字节需要两次操作,以及非跨32bit的两个字节需要特殊处理, 因此 visual c++等默认数据对齐方式为32bit, 以达到最高效率。

位域这种形式强烈地齐取决于编译器以及CPU, 这就是为什么不建议使用的原因。
xiepengchenghn 发表于 2010-11-4 11:08 | 显示全部楼层
9# McuPlayer
兄台能否详述下所为的maskbit的方法啊
icecut 发表于 2010-11-4 13:15 | 显示全部楼层
你应该问问微软:你们编译器支持吗?
pentral0311 发表于 2010-11-4 13:53 | 显示全部楼层
排除编译器等因素,我会选3
batsong 发表于 2010-11-4 14:08 | 显示全部楼层
关于位域,在嵌入式设计中应该尽量少用,而用maskbit的方式来代替
不是跨不跨字节的问题,而是不同的编译器会产生不同结果,这种不确定性在设计中才是要避免的 ...
McuPlayer 发表于 2010-11-3 16:16


我也这么认为,况且对于不能位寻址的字节,位域和mask的方式生成的指令应该没什么区别。徒增阅读难度而已
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

416

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部