1、前言
计算机存储的整型数据是存储的2进制,而此2进制并不是此10进制数直接对应的2进制数(原码),而是存储的此2进制数的补码。
所以,取反(~)是对补码的按位取反操作,而要从原码转换成补码,必须要先从原码转换成反码,再从反码转换成补码才可以。
注意:2进制的最高位是符号位(在最左侧)
2、看两个例子 :
问题1: ~0的值是多少?
以正整数 0(10进制)为例,要得到~0的结果,操作步骤如下 :
原码 0000 0000 把10进制数转换成8位的2进制数
反码 0000 0000 正数的反码是原码
补码 0000 0000 正数的补码也是原码
按位取反得到新补码 1111 1111 将补码按位取反,注意此时最高位从0变成了1,即已变成负数
新反码 1111 1110 再将[按位取反]后的新补码,转换成新反码,注意非常关键的一个变换过程:现在是将负数从补码转反码;那么需要将补码的最低位-1,同时符号位(1表示负,0表示正)要保持固定不变
新原码 1000 0001 再将新反码转新原码,注意是负数,符号位要固定不变,最后得到结果就是 -1 ,到此分析完毕。
问题2: ~-1的值是多少?
负整数-1(10进制)为例 ,要得到~-1的结果,操作步骤如下 :
原码 1000 0001 把10进制数转换成8位的2进制数
反码 1111 1110 负数的反码是,符号位(1表示负,0表示正)固定不变,其他位按位取反(通俗来讲就是把0变成1,1变成0)
补码 1111 1111 负数的补码是,符号位(1表示负,0表示正)固定不变,但是要在反码的最低位+1(最右侧+1)
按位取反得到新补码 0000 0000 按位取反后的补码(此步骤核心就是对应,这个操作符~ 的操作),我们需要将补码转换成反码,在转换成原码,最后转换成10进制数结果
注意上面[按位取反]步骤执行后,最高位从1变成了0,即已变成正数,后续我们要按照正数的反码、补码来进行操作
新反码 0000 0000 正数的反码与补码、原码是相同的
新原码 0000 0000 正数的反码与补码、原码是相同的
获取10进制数结果,就是0,到此分析完毕
问题3: ~1的值是多少?
以正整数 1(10进制)为例,要得到~0的结果,操作步骤如下 :
原码 0000 0001 把10进制数转换成8位的2进制数
反码 0000 0001 正数的反码是原码
补码 0000 0001 正数的补码也是原码
按位取反得到新补码 1111 1110 将补码按位取反,注意此时最高位从0变成了1,即已变成负数
新反码 1111 1101 再将[按位取反]后的新补码,转换成新反码,注意非常关键的一个变换过程:现在是将负数从补码转反码;那么需要将补码的最低位-1,同时符号位(1表示负,0表示正)要保持固定不变
新原码 1000 0010 再将新反码转新原码,注意是负数,符号位要固定不变,最后得到结果就是 -2 ,到此分析完毕。