C语言奇葩试题-2之左移右移超出位宽

在一个夜黑风高的晚上,有一剑客自称,自幼习代码多年,阅无数C语言题。今日有一码相求,代码如下:

#include <stdio.h>
int main()
{
   int Number=15;
   printf("out:%d",Number<<35);
   return 0;
}

输出结果为:
在这里插入图片描述
什么居然有人将一个32位的变量移动35位那结果不是0,在学习C语言的时候都知道左移多少位就在右边补多少个0,这个结果显然跟理论不一致,这也许就是人们所说的事与愿违,事情没能按照预想的方向发展。
其实这是计算机防止出现移动位数过大直接给0的一种机制,我们只需要这样算就可以了:

#include <stdio.h>
int main()
{
	   int Number=15;
	   printf("out:%d\n",Number<<35);
	   /*要移动的数据 << 移动的位数 对位宽(编译器的位数)求余
	   例如: Number<< (35%32);*/
	   printf("out:%d\n",Number<<35%32);//这个结果跟上面是一致的
	   return 0;
}

结果:
在这里插入图片描述
哈哈~~~~~搞定 其实这是 某大学研究生入学考试的题目
在这里插入图片描述
持续更新~欢迎留言奇葩问题

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的位运算符包括运算符(<<)、运算符(>>)、按位与运算符(&)、按位或运算符(|)和按位异或运算符(^)。其中运算符和运算符可以用来对一个数进行位操作。无符号数的是指将一个无符号数的二进制表示向或向动指定的位数,动后的空位用0填充。下面是一个无符号数的例子: 引用:例子二:无符号数的 #include <stdio.h> int main(){ unsigned int a = 0x80000001; int i=0; for(;i<64;i++){ printf("left %d:%08x,%u\n",i,a<<i,a<<i); } } 在这个例子中,我们定义了一个无符号整型变量a,并将其初始化为0x80000001。然后我们使用for循环对a进行了64次操作,每次的位数从0到63。在每次后,我们使用printf函数输出了的位数、后的结果以及结果的十进制表示。可以看到,每次后,a的值都会乘以2的动位数次方。 无符号数的是指将一个无符号数的二进制表示向动指定的位数,动后的空位用0填充。下面是一个无符号数的例子: 引用:例子四:无符号数的 #include <stdio.h> int main(){ unsigned int a = 0x10000001; int i=0; for(;i<64;i++){ printf("left %d:%08x,%u\n",i,a>>i,a>>i); } } 在这个例子中,我们定义了一个无符号整型变量a,并将其初始化为0x10000001。然后我们使用for循环对a进行了64次操作,每次的位数从0到63。在每次后,我们使用printf函数输出了的位数、后的结果以及结果的十进制表示。可以看到,每次后,a的值都会除以2的动位数次方。 需要注意的是,对于有符号数的,如果动后的空位用符号位填充,那么就会出现符号位溢出的问题。例如,如果将一个有符号整型变量i的值3位,那么动后的空位将用符号位填充。如果i的值为8,那么3位后,i的值将变为64,而不是24。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值