菜鸟求教:java 中的“取补码”问题!
发布时间:2025-05-20 22:45:19 发布人:远客网络
一、菜鸟求教:java 中的“取补码”问题!
~(位运算符),按位非,其运算法则为:如果某个数对应位上是1,则该位上最后得到的结果就是0;反之,如果某个数对应位上是0,则该位上最后得到的结果就是1.也就是有些人说的取反的意思,记住取反是在其转化为二进制后进行的。
补码的运算楼主可以看看:2的补码为
可以看出结果为一个负数,因为最高位为符号位,1为负数,0为正数。负数的补码的规则为取反再加1,过程为 11111101
最后把00000011转为十进制3,但不要丢了符号,因此2的补码为-3.
ps:楼主应该知道十进制、二进制、八进制、十六进制的相互转换吧,不知道的话,可要好好补补啊!
二、java求补码
~在c和java语言中都是求反码,或者叫位非NOT运算。
执行~4后转换成32位有符号整型(int),值为11111111111111111111111111111011
C语言的运算和java大类相同,但要注意几点
1、注意意无符号的情况。unsigned int i=~4;的值就是4294967291
2、注意变量的数据长度。在c中,char和char之间,short和short之间,long和long之间的加减都按本身定义的长短。而不像java都统一转换成32位int后进行运算
3、注意显示时符号的有无。printf中的%d和%u对显示结果就有本质区别
三、java中FFFFFFFF为什么是-1
1、FFFFFFFF转换2进制后首位为1即为负数(计算机规定如此),绝对值则是后面0111……1111(63个1)取反即为0000……0001,也就是说FFFFFFFF即为-1
2、PS:我是看了楼上聂鑫给出的博文,看明白了后终于想清楚了。想清楚了之后才想出答案是如此。
3、PPS:首位是符号位,计算正负的时候取反即得相应负正,但是计算反码补码时取反是不算符号位的,即如博文中所说1XXX XXXX取补码时是XXX XXXX取反,符号位1不取反。