c语言中左移操作符和右移操作符

整数在二进制的表示有3种:原码,反码,补码。

正数在二进制的表示的原码,反码,补码都是一样的,

然而负数有所不同,以-3为例:

原码:10000000000000000000000000000011

反码:111111111111111111111111111111111100(反码就是原码的符合位不变,其他位就是按位取反就是反码)

补码:111111111111111111111111111111111101(在反码的基础上加1)

左移操作符:

#include <stdio.h>
int main()
{
	int a = 3;
	int c = a <<1;
	printf("%d", c);
	return 0;
}

运行结果:

左移操作符是将补码向左移,<<1向左移动一位,缺就补0。因为此时的3是正整数,所以原码和补码一样,00000000000000000000000000000011。

向左移一位就是00000000000000000000000000000110,所以结果是6。

如果是-3的话向左移一位也就是:

111111111111111111111111111111111101->111111111111111111111111111111111010->111111111111111111111111111111111001->10000000000000000000000000000110

结果是-6

右移操作符有两种运算方法:

算数移位:右边丢弃,左边补原符合位

逻辑移位:右边丢弃,左边补0

右移操作符算数移位:

#include <stdio.h>
int main()
{
	int a = 3;
	int c = a >>1;
	printf("%d", c);
	return 0;
}

运行结果:

运行过程:

3的补码是

00000000000000000000000000000011->00000000000000000000000000000001

结果为1.

-3:

-3的补码:111111111111111111111111111111111101->111111111111111111111111111111111110->

111111111111111111111111111111111101->10000000000000000000000000000010

结为负2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值