原码反码补码
1:正整数的原码、反码、补码都是相同的。
2:负整数的原码、反码、补码需要计算。
负数的反码:原码的符号位不变,其他位按位取反得到的就是反码
负数的补码:反码+1就是 补码
一个整形四个字节=32个bit位
首位是符号位,符号位为1代表负数,符号位为0代表正数。
整数在内存中存储的是补码,计算的时候也是补码。
移位操作符
右移:
算数右移:右边丢弃,左边补原来的符号位(一般都是这)
逻辑右移:右边丢弃,右边直接补0.
C语言没有明确规定是算数还是逻辑右移,一般编译器上采用算数。
int b=a>>1
但是a的地址里的储存没变。b得到a得到之后的结果,但a还是不变。
正数右移一位有类似除二的效果。
左移操作符:
左边丢弃,右边补0.
位操作符:
&按位与(有0为0)
c=a&b:补码的对应二进制位有0为0,两个同时为1就为1.
|按位或(有1为1)
按二进制位有1为1,两个同时为0则为0.
^按位异或:
补码对应的二进制位相同为0.相异为1.
a^a=0
a^0=a
b=5
a^b^a=5异或是支持交换律的 不会进位,所以不会产生溢出。
a^a^b=5
不创建临时变量来实现整数的交换
a=a+b;
b=a-b;
a=a-b;
杂:
int*pa=&a;取出a的地址
~波浪号操作符
补码的二进制按位取反