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
- 整数为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);
}