符号位都是⽤0表⽰“正”,⽤1表⽰“负”。
正整数的原、反、补码都相同。
负整数的三种表⽰⽅法各不相同
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
补码得到原码也是可以使⽤:取反,+1的操作。
对于整形来说:数据存放内存中其实存放的是补码
1.位操作符(用补码的二进制位进行计算)
.& //按位与 :有0则为0,两个同时为1才为1
int a = 6;
//00000000000000000000000000000110 - 6的补码
int b = -7;
//00000000000000000000000000000111
//11111111111111111111111111111000 - 取反
//11111111111111111111111111111001 - 加1 -7的补码
int c = a & b;
//00000000000000000000000000000110 - 6的补码
//11111111111111111111111111111001 - 加1 -7的补码
//00000000000000000000000000000000 c=0
| //按位或:有1则为1,两个同时为0才为0
int a = 6;
//00000000000000000000000000000110 - 6的补码
int b = -7;
//00000000000000000000000000000111
//11111111111111111111111111111000 - 取反
//11111111111111111111111111111001 - 加1 -7的补码
int c = a | b;
//00000000000000000000000000000110 - 6的补码
//11111111111111111111111111111001 - 加1 -7的补码
//11111111111111111111111111111111
//10000000000000000000000000000000
//10000000000000000000000000000001 c=-1
^ //按位异或:相同为0,相异为1(11为0)
~ //按位取反:按(二进制)为取反
int a = 0;
printf("%d\n", ~a);
//00000000000000000000000000000000
//11111111111111111111111111111111
//10000000000000000000000000000000
//10000000000000000000000000000001 a=-1
2.移位操作符
左移操作符(有乘2效果)
移位规则:左边抛弃、右边补0
int num = 10;
//0000000000000000000000001010
int n = num << 1;
//0000000000000000000000010100
printf("n= %d\n", n);
//n=20
printf("num= %d\n", num);
//num=10
2 右移操作符
移位规则:算术右移: