位操作符^以及正负数在计算机中的存储

(数据是怎么在计算机中存储的)​
正数和负数在内存中都是以补码的形式存储的,但不同的是正数的原码,补码,反码都是相同的,而负数的原码,补码和反码是不同的。
负数的原码,补码,反码之间存在什么关系?
补码等于原码按位取反,但最高位即符号位不变
反码等于原码加一
原码等于反码按位取反加一,也等于反码减一得到补码再按位取反

注意:符号位0表示正数,1表示负数

例如:
在这里插入图片描述
由此我们可以去理解位操作符^在计算机中是怎么运算的

如下代码

#include
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
关键点在于数据在进行操作时,在计算机内都是以补码的形式进行操作,而输出时是以原码的形式输出,而在对正数进行操作时,因为正数的原码,补码,反码都相同,所以你可能会没考虑到它也是以补码的形式被操作的
位操作符^以及正负数在计算机中的存储_第1张图片
注意:在参与异或运算时符号位也参与,而在负数求补码时符号位不参与即不变
例二:-12^-10

#include
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;
}

结果展示:
在这里插入图片描述
位操作符^以及正负数在计算机中的存储_第2张图片
参与异或运算的数满足交换律即a ^ b ^c=a ^ c ^ b

你可能感兴趣的:(C,算法,c语言)