c语言左移在哪个头文件中,关于左移的一个疑问!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

八进制换成二进制楼主应该没有换算错误。真不会换算,拿附件里面的科学计算机也能换。

说说5L的问题所在,首先是语法问题,scanf("a=%o,n=%d",&a,&n);这句是不对的,scanf不能这么写,里面不能带常规字符。这样会出错,你不信的话,你直接printf出a和n的值看看。其次是%o在scanf和printf里面不一样,%o在scanf里面是获取有符号的八进制,而在printf里面是打印输出无符号的八进制,所以最好不要用八进制来写,下面的代码我用了十进制。这是两个语法错误,楼主应该好好扎实基础。

其次,是语义错误,也就是其实你这么写,我个人认为,仅仅是我个人认为是不对的,你这是循环右移程序,而你左移的时候有个16-n,这里的16是什么意思?难道是占的内存位数,那为啥不是32,然后我找到了网上普遍存在的两个宏代码,验证过去之后,发现把16换成32和网上的宏代码输出结果一样。即如下代码你看看最后2个printf是一样的结果:

#define CROR(value, bits) ((value >> bits) | (value << (0x20 - bits)))

#define CROL(value, bits) ((value << bits) | (value >> (0x20 - bits)))

#include

int main(){

unsigned a,b,c,d; int n;

printf("请输入a和n\n"); scanf("%u,%d",&a,&n);//示例输入0157653,3 //0157653(十进制)= 100110011111010101(二进制)

b=a<>n; d=c|b;

printf("%u %u %u %u\n",a,b,c,d);

printf("%u\n", CROR(a, n));

return 0;

}

排版不好,请见谅。

但是其实你用附件里面的科学计算机算一下0157653的循环右移三位的值,和上面得出的是不一样的,所以我个人大胆猜测网上的代码是错误的,具体原因在于循环右移的左移操作是错误的,即循环右移的左移0x20-bits那个是错误的,因为在内存中,我们的值前面会补0。上面那句话是我个人感觉的,我的意思就是想说假如内存存储整数用8位,我们的数是1011,那么实际存储的时候应该是00001011对不对,这样循环右移的左移操作就发生了错误。你可以动手在纸上画画,我是这么感觉的,也有可能是我昨天熬夜脑子不清醒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值