标题:很短的移位的程序,运行却不如意,求指导
只看楼主
潜行
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-11-13
结帖率:100%
已结贴  问题点数:10 回复次数:6 
很短的移位的程序,运行却不如意,求指导
#include <stdio.h>
#include <stdlib.h>

int main()
{   unsigned a,b,c;
    int n;
    scanf("a=%o,n=%d",&a,&n);
    b=a<<(16-n);
    c=a>>n;
    c=c|b;
    printf("%o   %o",a,c);
    return 0;
}
程序功能是将右端n位移到左端的n位。
运行:     a=157653,n=3(回车)
结果为: 157653    3375275765
自己算的结果应为:  157653   75765
因为八进制 157653,化为二进制为:1101111110101011    移位后应为:0111101111110101  即为八进制 75765   
不知哪出了问题
搜索更多相关主题的帖子: include return 二进制 八进制 如意 
2011-12-11 13:27
zy_space
Rank: 5Rank: 5
等 级:职业侠客
帖 子:163
专家分:364
注 册:2011-11-14
得分:0 
右移的时候应该注意系统填充的是"1"还是"0",不同的编译器不一样

何必等待?梦在今朝
2011-12-11 18:41
zy_space
Rank: 5Rank: 5
等 级:职业侠客
帖 子:163
专家分:364
注 册:2011-11-14
得分:0 
这一步:
c=a>>n,你认为c是0001 1011 1111 0101
但实际上是:
1111 1011 1111 0101
导致最终c = c | b变成了:
1111 1011 1111 0101
而不是你所预期的0111 1011 1111 0101

何必等待?梦在今朝
2011-12-11 18:46
zy_space
Rank: 5Rank: 5
等 级:职业侠客
帖 子:163
专家分:364
注 册:2011-11-14
得分:10 
那个,还有别的方面的问题——
二进制:1111 1111 1111 1111
对应的无符号int的值为2^16-1=65535,换算成八进制为177777
而你这里3375275765明显大于这个值,
八进制3375275765换算为二进制是:
1101 1111 1010 1011  1101 1111 1010 1
前十六位恰好是a的二进制,不知是不是一个巧合
总之内存方面有问题。。。。

何必等待?梦在今朝
2011-12-11 19:34
潜行
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-11-13
得分:0 
回复 3楼 zy_space
照这样推断  结果应为  175765     不过为什么会变成这么多位
2011-12-12 20:19
ohheart
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-1-18
得分:0 
b=a<<(16-n);  
/*把a左移13位后 unsigned int 转换为unsigned long int ,这样可以讲的通吗?大家都用的是C++编译器吧?不知是否跟编译器有关。用纯C编译器试试看吧。*/

[ 本帖最后由 ohheart 于 2011-12-12 21:35 编辑 ]
2011-12-12 21:33
zy_space
Rank: 5Rank: 5
等 级:职业侠客
帖 子:163
专家分:364
注 册:2011-11-14
得分:0 
回复 6楼 ohheart
移位把变量类型改变?这个绝对不可能。
应该和内存溢出方面有关系吧,这块只是我还没学到
我用的DevCpp编译器得到的结果和你是一样的


何必等待?梦在今朝
2011-12-12 22:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-357501-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.047425 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved