目录
一,原码 反码 补码
整数的二进制表示有3种形势:原码 反码 补码。
正整数的原码 反码 补码 相同;负整数的原码 反码 补码 是要计算的
整数在内存中存储的是补码的二进制
例如:
int a=5 ;
为正整数
00000000 00000000 00000000 00000101 原码 (二进制)
00000000 00000000 00000000 00000101 反码
00000000 00000000 00000000 00000101 补码
int a= -5 ;
为负整数
10000000 00000000 00000000 00000101 原码
//首位为1表示负号
11111111 11111111 11111111 11111010 反码 (原码的符号位不变,其他按位取反得到的就是反码)
11111111 11111111 11111111 11111011 补码 (反码+1 就是补码)
(以上以32为位位例)
二进制换算成十进制:
二,移位操作符
使用移位操作符后,进行打印时,打印语句时打印的为原码,故补码要转化为补码(移位规则将在下文介绍)
以左移操作符为例:
#include <stdio.h>
int main ()
{
int a = -5;
int b=a << 1;//左移一位
printf("%d\n",a);//-5
printf("%d\n",b);//-10
return 0;
}
//int a= -5 ;
//10000000 00000000 00000000 00000101 原码
//11111111 11111111 11111111 11111010 反码
//11111111 11111111 11111111 11111011 补码
//左移一位
//10000000 00000000 00000000 00001010 //转为原码 打印
1,左移操作符
#include <stdio.h>
int main()
{
int a = 5;
int b = a << 1;
printf("%d\n",a);//5
printf("%d\n",b);//10
return 0;
}
2,右移操作符
右移操作符分为两种:1.算数右移:右边丢弃,左边补原符号位(如图:原位置为01,则补0);2.逻辑右移:右边丢弃,左边补0
当前编译器,在右移的是采用算数右移。到底是算数右移还是逻辑右移是取决于编译器!
#include <stdio.h>
int main()
{
int a = -5;
int b = a >> 1;
printf("%d\n", a);//-5
printf("%d\n", b);//-3
return 0;
}
三,注意事项
警告:对于移位操作符,不要移动负数位,这是标准未定义的。
例如:
int a = 10;
num >> -1 ;//error