C++/C中!和~的区别与作用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuweiyuxiang/article/details/85853958

区别:

  1. !是逻辑运算符(与||,&&是一类符号),表示逻辑取反,可以把非0值变成0,把0值变为1
  2. ~是位运算符(与|,&是一类符号),表示按位取反,在数值的二进制表示上,将0变为1,将1变为0

例子:

#include<iostream>
using namespace std;

int main(){
	int a = 10;
	int b = 0;
	cout << "a:" << a << ",a的逻辑反是:" << !a << endl;
	cout << "b:" << b << ",b的逻辑反是:" << !b << endl;
	cout << "a:" << a << ",a的位反是:" << ~a << endl;
	cout << "b:" << b << ",b的位反是:" << ~b << endl;
	return 0;
}

结果:
在这里插入图片描述
解释:
a=10,a的逻辑反是0,很容易理解,但是a的按位取反为什么是-11可能就不太好理解了,在这里分析一下。整数在计算机内都是以二进制补码表示的,即如果计算机内有个二进制串,它会认为这个某个整数的补码表示。 假设使用使用8位二进制来表示int,最高位是符号位,则10的二进制形式是00001010,按位取反后是11110101,根据前面的解释可以知道,这是一个数字的补码。
我们知道对于正数来说,原码=反码=补码,即符号位固定为0,数值位相同。对于负数来说,负整数的符号位固定为1,求反码时,原码符号位1不变,数值位数的每一位求反。反码符号位1不变,反码数值位最低位加1,得到补码。 11110101的最高位是1,这个一个负数的补码。对于负数来说,原码=补码-1,数值为取反。11110101减1得11110100,再对数值为取反得10001011,这就是-11的原码表示。原码是给人看的,计算机内存储的是补码。最终11110101表示-11。

参考文章:

  1. 原码、反码、补码之间的转换和简单运算
  2. !和~的区别(逻辑取反和按位取反)

猜你喜欢

转载自blog.csdn.net/liuweiyuxiang/article/details/85853958