打印

关于字符值赋给位变量问题,谢谢!!

[复制链接]
2903|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kinggate|  楼主 | 2007-4-24 16:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我曾经用到这么一段语句:
sbit SER=P0^4;      //595串行数据输入
for(i=0;i<8;i++)    //循环移入8位数据,
  {  
     uchar temp;
     SCK=0;
     SER=temp&0x80;  // 取数码的最高位
     temp=temp<<1;
     SCK=1;    
  }
而且也看过这么一句话:"如果将一个整型数赋给位变量,只是将最低位赋给位变量",那参照这句话,SER=temp&0x80; 得到的SER值应该为temp的最低位吧?
但通过试验,得到的是temp的最高位啊,这不有点矛盾了吗?
哪位大虾帮我解析一下好吗??
谢谢!!

相关帖子

沙发
zhaoyu2005| | 2007-4-24 17:00 | 只看该作者

不知道你那句话是从哪里看到的

标准C里我不清楚,picc(pic单片机用的)里是,但是keil c里没见到,keil c可以是任何一位,你给哪一位赋值就是哪一位(只能一位,如果多位我没有测试)。

使用特权

评论回复
板凳
Swd21ic| | 2007-4-24 17:47 | 只看该作者

~~~

不是吧~~

你temp是定义的char型

temp & 0x80 是取temp的MSB嘛~~ 如果temp的MSB是1的话,
那么与出来就是 0x80
如果是MSB是0 那么与出来是0x00

SER=0x80   //SER=1;
SER=0x00   //SER=0;

使用特权

评论回复
地板
kinggate|  楼主 | 2007-4-24 18:24 | 只看该作者

3楼的请问您~~

你说的确实是这样,但我就不明白了,
当将一个字符型变量赋给一个位变量时,位变量是等于字符变量的最高位是吗?
那我将一个long型变量赋给一个char型变量,那char型变量得到的是long型变量的那些位??
谢谢!!

使用特权

评论回复
5
xwj| | 2007-4-24 18:44 | 只看该作者

赋值给位变量时,如果之前不是位,编译器默认会先强制转换成

规则就是原数为0结果为0,原数不为0则结果为1
SER=0x80   //SER=1;
SER=0x00   //SER=0;

“将一个long型变量赋给一个char型变量”,一般编译器会在保证符号不变的前提下取操作数的最低8位(有符号数取最低7位,并把原符号位(MSB)放如新的符号位位置(MSB))

对于很多DSP,还要区分饱和运算和非饱和运算,但51不用考虑那么多...


你最好先去看看帮助,多了解下编译器的行为和数据存放规律(帮助里都有的),不然只会越说你越糊涂,越解释问题越多。。。

呵呵:-)

使用特权

评论回复
6
kinggate|  楼主 | 2007-4-24 19:57 | 只看该作者

呵呵 你解析的很仔细,非常感谢您!

呵呵 5楼:你解析的很仔细,非常感谢您!

使用特权

评论回复
7
Swd21ic| | 2007-4-24 20:43 | 只看该作者

!!

确实很清楚~

使用特权

评论回复
8
tx040316| | 2007-4-24 21:17 | 只看该作者

我也说说

那我将一个long型变量赋给一个char型变量,那char型变量得到的是long型变量的那些位??
这句话好像不能这么说,在C51里面如果把一个LONG赋给一个CHAR的话那个CHAR会自己转为一个LONG.

使用特权

评论回复
9
王紫豪| | 2007-4-24 21:59 | 只看该作者

5楼老大说的很明白了

使用特权

评论回复
10
kinggate|  楼主 | 2007-4-25 08:54 | 只看该作者

呵呵 8楼的你的说法验证过吗

呵呵  8楼的你的说法验证过吗,
我正在编一个程序,用到这些操作,程序运行不如我所想,
我真怀疑你说的是对的!
谢谢!

使用特权

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

本版积分规则

13

主题

37

帖子

0

粉丝