Skip to content

原码 补码 反码

正整数三者相同 负整数需要计算 权重: 710=1112=20+21+22源码: 00000000000000000000000000000111 反码: 00000000000000000000000000000111 补码: 00000000000000000000000000000111 最高位为符号位,0为正,1为负


那么接下来看-7 源码: 10000000000000000000000000000111 反码: 11111111111111111111111111111000(符号位不变,其它位按位取反) 补码: 11111111111111111111111111111001(反码+1)


整数在内存中存的是二进制的补码,移位操作符操作的是内存中的二进制数

左移

以左移为例,自左移为<<= 只针对整数 对a=7 进行a<<2 ,操作为: 0000000000000000000000000000011100000000000000000000000000000111(空) 整体左移,左边丢弃,右边多出空位补0 相当于原数×2

右移

取决于编译器

算术移位(msvc,gcc)

右边丢弃,左边补原符号位(正0负1)

逻辑移位

右边丢弃,左边补0

按位与

两个是1才是1

按位或

一个是1就是1

按位异或

相同为0,相异为1

结合律

例:不借助第三个变量交换两个变量的值
cpp
a = a ^ b;//a = 3^5
b = a ^ b;//b = 3^5^5 = 0^3 = 3
a = a ^ b;//a = 3^5^3 = 0^5 = 5

无进位运算,所以不存在溢出