补码的运算楼主可以看看:2的补码为
2转换为二进制 ~ 00000010
结果11111101
可以看出结果为一个负数,因为最高位为符号位,1为负数,0为正数。负数的补码的规亏激则为取反再加1,过程为11111101
取反 00000010
加1 00000011
最后把00000011转为十进制3,但不要丢了符号,因此2的补码为-3.
不知楼主看懂了么。
ps:楼主应该知道十进制、二进制、八进制、十六进制的相互转换吧键空裤,不知道的话,可要好好补补啊!
~在c和java语言中都是求反码,或者叫位非NOT运算。java的运算有特殊性:
4的二进制为100,
执行~4后转换成32位有符号整型(int),值为11111111111111111111111111111011
打印时,按有符号解释成-5。
C语答昌言的运算和java大类相同,但要注意几点
1、注意意无符号的情况。unsigned int i=~4的值察衡就是4294967291
2、注意变量的数据长度。在c中,char和char之间,short和short之间,long和long之间的加减都按本身定义的长短。而不像java都统败举做一转换成32位int后进行运算
3、注意显示时符号的有无。printf中的%d和%u对显示结果就有本质区别
在2进制中,负数是以它正值的补码形式表达原码:一个整数,按照绝对值大绝行小转换成的二进制数,称为原码。
比如
0000
0000
0000
0000
0000
0000
0000
0101是
5的
原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
取反 *** 作指:原为1,得0;原为0,得1。(1变0
0变1)
比如:将5的二进制表达式的每一位取反,得
1111
1111
1111
1111
1111
1111
1111
1010
称:1111
1111
1111
1111
1111
1111
1111
1010
是
0000
0000
0000
0000
0000
0000
0000
0101
的反码。
反码是相互的,所以也可称:
1111
1111
1111
1111
1111
1111
1111
1010
和
0000
0000
0000
0000
0000
0000
0000
0101
互为反码。
补码:反码加1称为补码。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
那么,5的补码为:
1111
1111
1111
1111
1111
1111
1111
1010
+
1
=
1111
1111
1111
1111
1111
1111
1111
1011
所以,-5
在计算机中的二进制表达为:
1111
1111
1111
1111
1111
1111
1111
1011
转换为十六进制:0xFFFFFFFB。
====================================
明白了上面的就可以理解怎么求
~i
了
int型储存32个二进制位,~这个符号是按位取反,就是求i的反码。
即得到1111
1111
1111
1111
1111
1111
1111
1010
上面这串二进并凳哗制代表一个负数,将它转换成int型过程如下:
1111
1111
1111
1111
1111
1111
1111
1010-1
=
1111
1111
1111
1111
1111
1111
1111
1001
再求反:
0000
0000
0000
0000
0000
0000
0000
0110
这个值就是5的按位取反所得到的int整数的绝对值(注意粗雀:5按位取反得到的是负数)
所以转换为int型为:6
即:int型的i=5
取反后的结果为-6
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)