蓉杠学习网

j***a语言补码,j***a 补码 反码

大家好,今天小编关注到一个比较意思的话题,就是关于java语言补码问题,于是小编就整理了2个相关介绍Java语言补码的解答,让我们一起看看吧。

  1. 请教java小问题?
  2. 取反什么意思?

请教j***a小问题?

首先要了解,所有的有符号运算(正负)都是使用二进制补码进行加减运算的,先运算i-1,因为i是int最小值,转换为二进制,二进制所有位是1000000000......再转换成补码1111111...,再给补码-1,然后再转换成源码,然后就会数值溢出成了1011111....33位.那然后计算机数据进行截取,int得长度为32位,就会从0截取。这样就成了int得最大值

而最小值-1L,在编译时候,编译器会对最小值向上自动转换,转成long型,此时就成了int最小值变成long后+1,

java语言补码,java 补码 反码div>
图片来源网络,侵删)

这样2个数据想加就成了-2

首先需要知道 :

在JDK中,整形类型是有范围的,最大值为Integer.MAX_VALUE,即2147483647,最小值为Integer.MIN_VALUE -2147483648。

java语言补码,java 补码 反码
(图片来源网络,侵删)

因此 i=Integer.MIN_VALUE 即 i = -2147483648;

然后i-1 溢出了, 所以结果为 21474837;

i-1L 这里的结果应该为long长整型,因此 i-1L 的结果为 -2147483649;

java语言补码,java 补码 反码
(图片来源网络,侵删)

最后 21474837 与 -2147483649的和为-2。

因此结果为-2。

值为-2

1. int 的取值区间:

最大值为 2147483647,最小值为 -2147483648。

2. int 溢出特性

正数过大溢出为负数,负数过小溢出为正数,

即,最大值 2147483647 再增 1 得到 -2147483648,

同理,最小值 -2147483648 再减 1 得到 2147483647

3. 整数直接量默认为 int 型:

如:1、2、99、56 ... ,整数直接量默认都是 int 类型

4. 不同数据类型之间做数学运算:

答案是-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

分享:
扫描分享到社交APP