(数据是怎么在计算机中存储的)
正数和负数在内存中都是以补码的形式存储的,但不同的是正数的原码,补码,反码都是相同的,而负数的原码,补码和反码是不同的。
负数的原码,补码,反码之间存在什么关系?
补码等于原码按位取反,但最高位即符号位不变
反码等于原码加一
原码等于反码按位取反加一,也等于反码减一得到补码再按位取反
注意:符号位0表示正数,1表示负数
例如:
由此我们可以去理解位操作符^在计算机中是怎么运算的
如下代码
#include<stdio.h>
int main() {
int a = 10;
int b = -12;
int c = a ^ b;
printf("a=%d b=%d\n", a, b);
printf("a^b=%d\n", c);
return 0;
}
结果展示:
^操作符成为按位异或操作符,计算方式是以补码按位比较,当相同时结果为0,不同时结果为1
关键点在于数据在进行操作时,在计算机内都是以补码的形式进行操作,而输出时是以原码的形式输出,而在对正数进行操作时,因为正数的原码,补码,反码都相同,所以你可能会没考虑到它也是以补码的形式被操作的
注意:在参与异或运算时符号位也参与,而在负数求补码时符号位不参与即不变
例二:-12^-10
#include<stdio.h>
int main() {
int a = -10;
int b = -12;
int c = a ^ b;
printf("a=%d b=%d\n", a, b);
printf("a^b=%d\n", c);
return 0;
}
结果展示:
参与异或运算的数满足交换律即a ^ b ^c=a ^ c ^ b