打印

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

[复制链接]
3411|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
busdriver|  楼主 | 2010-11-3 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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

共用体大小??

使用特权

评论回复
5
ayb_ice| | 2010-11-3 15:47 | 只看该作者
这取决于具体的目标编译器,也就是目标CPU
其实就是考虑内存对齐的问题

使用特权

评论回复
评分
参与人数 2威望 +5 收起 理由
mxh0506 + 1
McuPlayer + 4 一语中的
6
busdriver|  楼主 | 2010-11-3 16:11 | 只看该作者
兄台言之有理,在下极为佩服!

使用特权

评论回复
7
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 位二进位。

请兄台看看这段话。

使用特权

评论回复
8
busdriver|  楼主 | 2010-11-3 16:14 | 只看该作者
上面这段话出自国内C语言开山大师谭浩强先生著名著作《C语言程序设计》

使用特权

评论回复
9
McuPlayer| | 2010-11-3 16:16 | 只看该作者
关于位域,在嵌入式设计中应该尽量少用,而用maskbit的方式来代替
不是跨不跨字节的问题,而是不同的编译器会产生不同结果,这种不确定性在设计中才是要避免的

使用特权

评论回复
10
busdriver|  楼主 | 2010-11-3 16:16 | 只看该作者
谭浩强先生这段话应该是针对通用处理器的吧?

编译器种类繁多,特别是单片机的。贵兄台知道HT PICC支持哪一种位域对齐?

使用特权

评论回复
11
busdriver|  楼主 | 2010-11-3 16:18 | 只看该作者
加分是否意味自己要减分?

使用特权

评论回复
12
busdriver|  楼主 | 2010-11-3 16:18 | 只看该作者
不知道?

使用特权

评论回复
13
busdriver|  楼主 | 2010-11-3 22:54 | 只看该作者
上技术热贴10大了,我甚惶恐啊

使用特权

评论回复
14
busdriver|  楼主 | 2010-11-3 22:56 | 只看该作者
很多人看,但是甚少人回帖,我甚惶恐啊

使用特权

评论回复
15
busdriver|  楼主 | 2010-11-3 22:59 | 只看该作者
睡觉了。我甚惶恐啊

使用特权

评论回复
16
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, 这就是为什么不建议使用的原因。

使用特权

评论回复
17
xiepengchenghn| | 2010-11-4 11:08 | 只看该作者
9# McuPlayer
兄台能否详述下所为的maskbit的方法啊

使用特权

评论回复
18
icecut| | 2010-11-4 13:15 | 只看该作者
你应该问问微软:你们编译器支持吗?

使用特权

评论回复
19
pentral0311| | 2010-11-4 13:53 | 只看该作者
排除编译器等因素,我会选3

使用特权

评论回复
20
batsong| | 2010-11-4 14:08 | 只看该作者
关于位域,在嵌入式设计中应该尽量少用,而用maskbit的方式来代替
不是跨不跨字节的问题,而是不同的编译器会产生不同结果,这种不确定性在设计中才是要避免的 ...
McuPlayer 发表于 2010-11-3 16:16


我也这么认为,况且对于不能位寻址的字节,位域和mask的方式生成的指令应该没什么区别。徒增阅读难度而已

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

416

帖子

0

粉丝