当一个长整数被转换成一个短整数时,发生了什么?
When a long integer is cast into a short one, what happened?
我用java复制一个长整数y到一个短整数x:
long y = 40002;
short x = (short) y;
System.out.println("x now equals " + x);
结果是:x 现在等于 -25534。
我试图弄清楚 40002 是如何转换为 -25534 的,但我失败了。其中40002对应1001 1100 0100 0010,-25534对应1110 0011 1011 1110,有朋友能告诉我这个过程中发生了什么吗?非常感谢!
Integer overflow 发生了。
一个short是两个有符号字节,也就是说Short.MAX_VALUE
是215-1,也就是32767。 "Larger" 值在逻辑上 "wrap around" 进入负值范围。
在这种情况下,超出的金额为 40,002 - 215 = 7234
Short.MIN_VALUE
是 -215 = -32,768
-32,768 + 7234 = -25,534
你想知道的是哪个数字。
您将 long
转换为 short
所做的是 缩小原始转换 ,JLS, Section 5.1.3 :
A narrowing conversion of a signed integer to an integral type T simply discards all but the n lowest order bits, where n is the number of bits used to represent type T. In addition to a possible loss of information about the magnitude of the numeric value, this may cause the sign of the resulting value to differ from the sign of the input value.
long
值40002
是以下64位:
00000000 00000000 00000000 00000000 00000000 00000000 10011100 01000010
转换仅保留最低有效 16 位:
10011100 01000010
前导 1
在 2 的补码表示法中被解释为 -2^15,而不是 +2^15。这就解释了为什么 long
值和 short
值相差 2^16,即 65,536。
谢谢大家。根据大家的回答,我总结如下:
long值40002是以下64位:
00000000 00000000 00000000 00000000 00000000 00000000 10011100 01000010
转换仅保留最低有效 16 位:
10011100 01000010
当JVM把10011100 01000010看成一个短整数时,会这样计算:
-2^15 + 00011100 01000010 = -32768 + 7234 = -25534
就是这个。
基本上,它会循环遍历这些值,当您达到最大值并加 1 时,它将成为最低值,因此 32768 将是 -32768,当您达到 65536 (32768*2) 时,它是将是 0,当你达到 98303 (32768*2+32767) 它将是 32767,如果你添加一个你将得到 98304 (32768*3) 并且它将再次是-32768.
所以40002(高于32768但低于32768*2)换空后显然是负数
我用java复制一个长整数y到一个短整数x:
long y = 40002;
short x = (short) y;
System.out.println("x now equals " + x);
结果是:x 现在等于 -25534。
我试图弄清楚 40002 是如何转换为 -25534 的,但我失败了。其中40002对应1001 1100 0100 0010,-25534对应1110 0011 1011 1110,有朋友能告诉我这个过程中发生了什么吗?非常感谢!
Integer overflow 发生了。
一个short是两个有符号字节,也就是说Short.MAX_VALUE
是215-1,也就是32767。 "Larger" 值在逻辑上 "wrap around" 进入负值范围。
在这种情况下,超出的金额为 40,002 - 215 = 7234
Short.MIN_VALUE
是 -215 = -32,768
-32,768 + 7234 = -25,534
你想知道的是哪个数字。
您将 long
转换为 short
所做的是 缩小原始转换 ,JLS, Section 5.1.3 :
A narrowing conversion of a signed integer to an integral type T simply discards all but the n lowest order bits, where n is the number of bits used to represent type T. In addition to a possible loss of information about the magnitude of the numeric value, this may cause the sign of the resulting value to differ from the sign of the input value.
long
值40002
是以下64位:
00000000 00000000 00000000 00000000 00000000 00000000 10011100 01000010
转换仅保留最低有效 16 位:
10011100 01000010
前导 1
在 2 的补码表示法中被解释为 -2^15,而不是 +2^15。这就解释了为什么 long
值和 short
值相差 2^16,即 65,536。
谢谢大家。根据大家的回答,我总结如下: long值40002是以下64位:
00000000 00000000 00000000 00000000 00000000 00000000 10011100 01000010
转换仅保留最低有效 16 位:
10011100 01000010
当JVM把10011100 01000010看成一个短整数时,会这样计算:
-2^15 + 00011100 01000010 = -32768 + 7234 = -25534
就是这个。
基本上,它会循环遍历这些值,当您达到最大值并加 1 时,它将成为最低值,因此 32768 将是 -32768,当您达到 65536 (32768*2) 时,它是将是 0,当你达到 98303 (32768*2+32767) 它将是 32767,如果你添加一个你将得到 98304 (32768*3) 并且它将再次是-32768.
所以40002(高于32768但低于32768*2)换空后显然是负数