大家好,今天小编关注到一个比较有意思的话题,就是关于java语言补码的问题,于是小编就整理了2个相关介绍Java语言补码的解答,让我们一起看看吧。
请教j***a小问题?
首先要了解,所有的有符号的运算(正负)都是使用二进制补码进行加减运算的,先运算i-1,因为i是int得最小值,转换为二进制,二进制所有位是1000000000......再转换成补码1111111...,再给补码-1,然后再转换成源码,然后就会数值溢出成了1011111....33位.那然后计算机对数据进行截取,int得长度为32位,就会从0截取。这样就成了int得最大值。
而最小值-1L,在编译时候,编译器会对最小值向上自动转换,转成long型,此时就成了int最小值变成long后+1,
这样2个数据想加就成了-2
首先需要知道 :
在JDK中,整形类型是有范围的,最大值为Integer.MAX_VALUE,即2147483647,最小值为Integer.MIN_VALUE -2147483648。
因此 i=Integer.MIN_VALUE 即 i = -2147483648;
然后i-1 溢出了, 所以结果为 21474837;
i-1L 这里的结果应该为long长整型,因此 i-1L 的结果为 -2147483649;
最后 21474837 与 -2147483649的和为-2。
因此结果为-2。
值为-2
1. int 的取值区间:
最大值为 2147483647,最小值为 -2147483648。
2. int 溢出特性:
正数过大溢出为负数,负数过小溢出为正数,
即,最大值 2147483647 再增 1 得到 -2147483648,
同理,最小值 -2147483648 再减 1 得到 2147483647
如:1、2、99、56 ... ,整数直接量默认都是 int 类型
答案是-2。为什么这样呢,因为i取Integer的最小值是个常数,也就是int的最小值-2147483648,减1,发生溢出,变为21474837。这应该很好理解,但减去1l呢,这里会用long类型接收结果,不发生溢出就是-2147483649和为-2。建议题主遇到这样的问题自己动动手,把每一步结果输出一下记忆更深刻
这个问题看似简单,但如果不实际测试可能还真会搞错,最好的办法是写个Demo将各个值输出,就能揣摩出其中的意思,咱们结合程序及输出来分析下:
在J***a中整形是有数据范围的,其中最小值:Integer.MIN_VALUE是-2147483648。如果在此基础上再减1,就会出现溢出现象,从输出结果看已经变成:2147483647。而(i-1L)返回是long长整形,再减去1,不会发生溢出正常计算,结果是:-2147483649。
(i-1):2147483647
(i-1L):-2147483649
所以,(i-1) + (i-1L)结果就是:-2。
取反什么意思?
取反,是J***a与C/C++使用补码来表示二进制数,在补码表示中,最高位为符号位,正数的符号位为0,负数为1。
补码的规定如下:
对正数来说,最高位为0,其余各位代表数值本身(以二进制表示),如+42的补码为00101010。
对负数而言,把该数绝对值的补码按位取反,然后对整个数加1,即得该数的补码。如-42的补码为11010110(00101010按位取反11010101+1即11010110)
用补码来表示数,0的补码是单一的,都为00000000。(而在原码,反码表示中,+0和-0的表示是不单一的,可参见相应的书籍)。而且可以用111111表示-1的补(这也是补码与原码和反码的区别)。
到此,以上就是小编对于j***a语言补码的问题就介绍到这了,希望介绍关于j***a语言补码的2点解答对大家有用。
[免责声明]本文来源于网络,不代表本站立场,如转载内容涉及版权等问题,请联系邮箱:83115484@qq.com,我们会予以删除相关文章,保证您的权利。 转载请注明出处:http://www.rongung.com/post/23214.html