菜鸟求教:java 中的“取补码”问题!?

菜鸟求教:java 中的“取补码”问题!?,第1张

~ (位运算符),按位非,其运算法则为:如果某个数对应位上是1,则该位上最后得到的结果就是0;反之,如果某个数对应位上是0,则该位上最后得稿简到的结果就是1.也就是有些人说的取反的意思,记住取反是在其转化为二进制后进行的。

补码的运算楼主可以看看: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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12514482.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存