对keil移位的不解。请指点

[复制链接]
5292|15
 楼主| huangqi412 发表于 2007-3-14 15:55 | 显示全部楼层 |阅读模式
都说c中》和《是补0,
但是为什么我在keil中软件仿真发现不对劲呢。
如果是unsigned右移是补0,为什么用char则补1呢?
char f;
f=0xfd;
f=f>>1;   //
发现它变成了0xfe呢,也就是说右移后左边是补的1
ayb_ice 发表于 2007-3-14 16:12 | 显示全部楼层

随便说说

    应该是这样吧
    unsigned char f; 
    f=0xFD;
    f = f>>1;    //
hkap 发表于 2007-3-14 16:18 | 显示全部楼层

char 是有符号变量,最高位为1表示负数

浪淘沙 发表于 2007-3-14 16:44 | 显示全部楼层

3楼正解;不能因为移位而使一个负数变成正数

 楼主| huangqi412 发表于 2007-3-14 21:38 | 显示全部楼层

再请教一下

main()
{
char yiwei();

~~~~~
deng=yiwei(deng,n);

~~~~~~
}


char yiwei(char s,char r)//传递参数,被移数和移动次数
{
unsigned char b,c;     //用uchar型
b=s>>(8-r);           //这里变成补1  什么原理呢
c=s<<r;              //这里左移是补0
s=c|b;              //
return(s);
}
如果我不改变大体结构的话,怎么变成补0呢,
平常人 发表于 2007-3-14 22:05 | 显示全部楼层

这是在做循环移位,楼主不妨用几个数在纸上演算一下,很

在纸上演算一下是个非常有效的办法,对这种小程序非常合适;自己演算一下印象更深刻。
 楼主| huangqi412 发表于 2007-3-14 22:37 | 显示全部楼层

我现在问题是不知道为什么变成了补1,原因

现在我知道可以这个可以直接调库函数
不过,刚用了几天keil c,这两天在里面乱搞鼓,看各种情况机器是怎么处理的,什么原理,以后真正写程序就有章可循,知道怎么样写好一些。出了错也容易找。
sjnh 发表于 2007-3-15 09:02 | 显示全部楼层

负数右移当然补1

就像 浪淘沙 说得,补0就变成正数了
9398711029 发表于 2007-3-15 09:22 | 显示全部楼层

那负数左移怎么就能边成正数呢?

deng=0x8e;
deng<<=1;
//deng=?
 楼主| huangqi412 发表于 2007-3-15 11:21 | 显示全部楼层

懂拉,谢谢

rainbowwrh 发表于 2007-3-15 14:55 | 显示全部楼层

移位

看是算术移位还是逻辑移位了额
前者是把最高位补到后面去
后者是补0到最低位去
悠忽 发表于 2007-3-16 23:01 | 显示全部楼层

好好看看C语言的书吧,逻辑移位和算术移位是有区别的

unsigned右移是补0,用c有符则补1
computer00 发表于 2007-3-17 01:08 | 显示全部楼层

同样是>>操作,不同的系统结果可能会不一样,有的是逻辑右

有的是算术右移.  只有有符号的负数右移时,才会出现这个问题。
 楼主| huangqi412 发表于 2007-3-17 08:48 | 显示全部楼层

恩看了,潭浩强c语言书上说的,只有负数右移有点麻烦

zxq1234508 发表于 2007-3-17 09:52 | 显示全部楼层

为什么int型和unsigned int型不会出现楼主说的那中情况呢?我刚才试过了。
computer00 发表于 2007-3-17 10:04 | 显示全部楼层

int型,你用-1去试试?

您需要登录后才可以回帖 登录 | 注册

本版积分规则

622

主题

24960

帖子

18

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