C语言操作符—左移右移操作符

1、移位操作符

移位操作符移动的是二进制位
只支持整数不支持浮点数

十进制转二进制

123

十进制的 123
从右往左 下标
3 x 100 = 3
2 x 101 = 20
1 x 102 = 100
3 x 100+2 x 101+1 x 102 = 123

  1. 第一位为符号位
  2. 负数为1
  3. 整数为0

7
00000000 00000000 00000000 00000111 -原码
00000000 00000000 00000000 00000111 - 反码
00000000 00000000 00000000 00000111 - 补码
-7
10000000 00000000 00000000 00000111 -原码
11111111 11111111 11111111 11111000 ——反码(源码的符号位不变,其它位按位取反就是反码)
11111111 11111111 11111111 11111001 ——补码(反码加1)
整数在内存中存储的是补码


1.2 << 左移操作符

左移数字会变大
左边丢弃,右边补零

1.2.1 >> 左移操作符 —— 正数

7
00000000 00000000 00000000 00000111 — 补码 左移后
0-弃 00000000 00000000 00000000 00000111 0-补
00000000 00000000 00000000 00001110 — 补码左移后
1x23+ 1x22 + 1x21 + 0x20 = 14 — 计算后


1.2.2 >> 左移操作符 —— 负数

左边丢弃,右边补零
计算机内存中是补码
负数的补码进行左移后,将补码变反码,反码变原码,计算就好了,符号位不变。

-7
11111111 11111111 11111111 11111001 — 补码
11111111 11111111 11111111 11110010 — 补码左移后(左弃右补)
11111111 11111111 11111111 11110001 — 反码(补码-1)
10000000 00000000 00000000 00001110 — 原码
1x23 + 1x22 + 1x21 + 1x20 = -14 — 结果


1.3 >> 右移操作符

右移会变小

算术移位 — 右边丢弃,左边补原符号位
逻辑移位 — 右边丢弃,左边补0
究竟算术移位还是逻辑移位取决于编译器

7
00000000 00000000 00000000 00000111 — 补码
00000000 00000000 00000000 00000011 — 补码右移后
1x21+1x20 = 3

-7
11111111 11111111 11111111 11111001 — 补码
11111111 11111111 11111111 11111100 — 补码右移后
11111111 11111111 11111111 11111011 — 反码(补码-1)
10000000 00000000 00000000 00000100
1x22+0x21+0x20 = -4

int main()
{
	int a = 7; 
	int a = -7; 
	int b = a >> 1;
	printf("a = %d\n",a);
	printf("b = %d\n",b);
}

注意:移位操作符的操作数只能是整数

(点击跳转)

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值