整数的二进制的表达形式有3种。
原码
反码
补码
下面我们举一个例子吧
十进制的2
原码:00000000000000000000000000000010(常见的形式)
反码:00000000000000000000000000000010
补码:00000000000000000000000000000010
小结 正整数的原码反码补码相同
十进制的-2
原码:10000000000000000000000000000010(与2不同的是第一位符号位是1)
反码:11111111111111111111111111111101(除了符号位,其他位取反,1~0,0~1)
补码:11111111111111111111111111111110(反码加1)
小结 负整数的第一位符号位是1;反码是除符号位外,其他位取反;补码就是反码+1
总结原码、反码、补码的转换
正整数就不必多说,原码,反码,补码都一样。
重点:在计算机内存中存储的是补码
一、移位操作符.
<< 左移操作符
>> 右移操作符
移位操作符,操作的是二进制的补码
怎么使用呢
左移操作符
移动规则:左边抛弃,右边补0
右移操作符
移动规则:
首先右移操作符分两种
逻辑移动
右边抛弃,左边补0
算术移动(计算机中的操作)
右边抛弃,左边用符号位填充(针对负整数)
二、位操作符
& 按位与
| 按位或
^ 按位异或
~ 按位取反
位操作符是针对二进制补码进行计算的
& 对应二进制位,有0则为0,全为1才为1
Eg
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = a & b;
printf("%d", c);
return 0;
}
| 对应的二进制位有1则为1,全0才为0
一样是对二进制的补码进行操作
^ 对应二进制位相同为0,相异为1
对二进制补码进行操作
a^a=0; a与a的二进制补码全部相同
0^a=a;0的二进制补码全是0,导致a的二进制补码没有发生变化
通过按位异或的学习,我们可以巧妙的用它进行两个数字的交换(不建立第三变量)
~ 对二进制位取反
所有补码的二进制位取反
-1的补码是11111111111111111111111111111111
所以~a=0;
三、布尔类型
bool(_Bool)类型表示真假