弄懂这个只需要知道两点即可:
1.在计算机中存储数据的方式大多是用补码,我们在计算机上进行的取反操作多是针对补码进行取反【是的在 C++ 中,几乎所有的有符号整数类型(如 short、int、long、long long、char、以及来自 <cstdint> 的固定宽度整数类型)都采用补码表示。这种表示方式在计算机中的处理和计算上非常高效,因此成为了主流的整数表示方式。】
2.源码、反码、补码的基本特性和关系【讲一下补码:
在计算机内部,整数是以二进制形式存储的。对于有符号整数:
- 正数用补码表示与其绝对值相同。
- 负数需要用补码来表示,而计算补码的方法是:对符号的绝对值的二进制数取反,然后加1。
】
举个例子:

一:看清x=5和x=-5在计算机中的存储数据:
int 5 在计算机的存储形式是:
00000000000000000000000000000101,会二进制的同学直接可以看出是5。
int -5在计算机的存储形式是:
11111111111111111111111111111011
步骤一:需要先在保留符号位的情况下取反得到:
10000000000000000000000000000100(最左边是符号位,0代表+,1代表-)
步骤二:得到的结果+1
10000000000000000000000000000101(最左边是符号位,0代表+,1代表-)等于-5
二:认知实际上我们在计算机上做的取反操作
int x=5,对x取反x=~x实际上:
00000000000000000000000000000101(这是5的补码:回忆,正数用补码表示与其绝对值相同)
取反得到:
11111111111111111111111111111010(这还是补码,但因为取反的结果,最左边的符号位为1,所以是负数的补码:回忆,负数需要用补码来表示,而计算补码的方法是:对符号的绝对值的二进制数取反,然后加1。)
步骤一:需要先在保留符号位的情况下取反得到:
10000000000000000000000000000101(最左边是符号位,0代表+,1代表-)
步骤二:得到的结果+1
10000000000000000000000000000110(最左边是符号位,0代表+,1代表-)等于-6
所以看懂上面这个例子后,1取反得到-2你应该能理解了吧。不理解继续再看下面
int 1在计算机内存储的形式是补码,为:
00000000000000000000000000000001
取反后得:
11111111111111111111111111111110(但因为取反的结果,最左边的符号位为1,所以是负数的补码:回忆,负数需要用补码来表示,而计算补码的方法是:对符号的绝对值的二进制数取反,然后加1。)
步骤一:需要先在保留符号位的情况下取反得到:
10000000000000000000000000000001(最左边是符号位,0代表+,1代表-)
步骤二:得到的结果+1
10000000000000000000000000000010(最左边是符号位,0代表+,1代表-)等于-2
记住,存储形式是补码、补码、补码,在负数的情况下是需要转换步骤的。
加油!
C++中整数补码取反操作详解
2941

被折叠的 条评论
为什么被折叠?



