读书人

也帖一道面试题解决思路

发布时间: 2012-04-21 14:34:44 作者: rapoo

也帖一道面试题
有一个累加器,由两个8位寄存器组成,地址分别为A、A+1,A为低位地址,中断的时候就会触发累加。数据线是8位的,一次只能读一个寄存器,如何比较准确得到累加器的值?


我的答案是:
unsigned char a=*A;
unsigned char b=*(A+1);
short c = (b << 8)|a;

但这是错的,各位有何方法?

[解决办法]
unsigned short get()
{
static unsigned char prea,preb,flag=0;
unsigned char a=*(unsigned char *)A;
unsigned char b=*(unsigned char *)(A+1);
if(!flag)
{
prea=a,preb=b,flag=1;
return (b << 8)|a;

}
else
{
if(a==0)
b+=1;
return (b << 8);

}

}
[解决办法]
b << 8会隐形提升到无符号整型么?如果不会那么结果显然不对,而且short也应该是无符号的把
short c = (b << 8)|a;
改成
unsigned short c = (((unsigned short)b) << 8)|a;


[解决办法]

探讨

引用:

unsigned short get()
{
static unsigned char prea,preb,flag=0;
unsigned char a=*(unsigned char *)A;
unsigned char b=*(unsigned char *)(A+1);
if(!flag)
{
prea=a,preb=b,flag=1;
r……

[解决办法]
探讨

unsigned short get()
{
unsigned char preb = *(unsigned char *)(A+1);
// 关键在这里有间隔,涉及边界条件。
unsigned char prea = *(unsigned char *)A;

// 矫正
unsigned char b=*(unsigned char *)(A+1);

if (b != p……

[解决办法]
难道应该在读之前和读完这两条语句之间设置临界段,这样可以避免产生中断改变计数器的值.
[解决办法]
不懂


2
[解决办法]
看来我太浅薄了,顶一下
[解决办法]
C/C++ code
// 定义累加器寄存器#define   REGACC    (*(volatile unsigned short * )A)// 使用寄存器unsigned short value;value = REGACC;
[解决办法]
探讨

引用:

unsigned short get()
{
static unsigned char prea,preb,flag=0;
unsigned char a=*(unsigned char *)A;
unsigned char b=*(unsigned char *)(A+1);
if(!flag)
{
prea=a,preb=b,flag=1;
r……

[解决办法]
仔细看确实考察不少东西

读书人网 >C语言

热点推荐