结果说明
Explanation about a result
嗨,我对一些代码有一点问题,我无法解释我得到的结果。
//what happens?
public static void what() {
int number = 2147483647;
System.out.println(number + 33);
}
//Here is my solution for the probleme
public static void what() {
long number = 2147483647;
System.out.println(number + 33);
}
第一个以 int 数字作为变量的代码给出了 -2147483616
作为结果。因此,当我将 int 更改为 long 时,我得到了预期的好结果。所以问题是谁可以帮我解释一下为什么 int number + 33 = -2147483616
原始 int 类型的最大值为 2147483647,这就是您要将数字设置为的值。当向这个值添加任何东西时,int 类型不能正确表示它并且 'wraps' 左右,变成负数。
long 类型的最大值是 9223372036854775807,所以第二个代码片段工作正常,因为 long 可以毫无问题地保存该值。
您已达到原始类型 int 的最大值 (2147483647)。
如果 int 溢出,它会回到最小值 (-2147483648) 并从那里继续。
考虑第二个片段的计算,以及结果的实际含义。
long number = 2147483647;
number += 33;
结果十进制为2147483680,十六进制(更容易显示值的含义)为0x80000020。
对于第一个片段,十六进制的结果是也0x80000020,因为int
类型的算术结果是[=的低32位30=] 结果。不同的是解释:作为一个 int
,0x80000020 设置了最高位,而最高位的 "weight" 为 -231,所以这个结果被解释为 -231 + 32(负数)。作为long
,第32位只是一个权重为231的普通位,结果被解释为231 + 32.
Java 整数基于 32 位。第一位保留为符号 (+ = 0 / - = 1).
所以 2147483647
等于 01111111 11111111 11111111 11111111
。
添加更多将强制值变为负数,因为第一位变为 1。
10000000 00000000 00000000 00000000
等于 -2147483648
。
您要添加到 -2147483648
的剩余 32 个会得到 -2147483616
的结果。
原始类型 int
是一个 32 位整数,只能存储从 -2^31
到 2^31 - 1
而 long
是一个 64 位整数,所以它可以显然存储了更大的值。
当我们计算int
的容量时,它从-2147483648
变为2147483647
。
现在你很疑惑..为什么我加了33
之后就变成了-2147483616
?
这是因为"reset"的数据排序超出了限制。
因此,2147483647 + 1
将导致 -2147483648
。从这里,您可以看到 -2147483648 + 32
将导致您的示例中的值为 -2147483616
.
Some extra info below:
除非你真的需要使用大于int容量的数字,否则总是使用int,因为它占用更少的内存space.
此外,如果您的数字大于 long,请考虑使用 BigInteger
。
希望对您有所帮助!
嗨,我对一些代码有一点问题,我无法解释我得到的结果。
//what happens?
public static void what() {
int number = 2147483647;
System.out.println(number + 33);
}
//Here is my solution for the probleme
public static void what() {
long number = 2147483647;
System.out.println(number + 33);
}
第一个以 int 数字作为变量的代码给出了 -2147483616
作为结果。因此,当我将 int 更改为 long 时,我得到了预期的好结果。所以问题是谁可以帮我解释一下为什么 int number + 33 = -2147483616
原始 int 类型的最大值为 2147483647,这就是您要将数字设置为的值。当向这个值添加任何东西时,int 类型不能正确表示它并且 'wraps' 左右,变成负数。
long 类型的最大值是 9223372036854775807,所以第二个代码片段工作正常,因为 long 可以毫无问题地保存该值。
您已达到原始类型 int 的最大值 (2147483647)。 如果 int 溢出,它会回到最小值 (-2147483648) 并从那里继续。
考虑第二个片段的计算,以及结果的实际含义。
long number = 2147483647;
number += 33;
结果十进制为2147483680,十六进制(更容易显示值的含义)为0x80000020。
对于第一个片段,十六进制的结果是也0x80000020,因为int
类型的算术结果是[=的低32位30=] 结果。不同的是解释:作为一个 int
,0x80000020 设置了最高位,而最高位的 "weight" 为 -231,所以这个结果被解释为 -231 + 32(负数)。作为long
,第32位只是一个权重为231的普通位,结果被解释为231 + 32.
Java 整数基于 32 位。第一位保留为符号 (+ = 0 / - = 1).
所以 2147483647
等于 01111111 11111111 11111111 11111111
。
添加更多将强制值变为负数,因为第一位变为 1。
10000000 00000000 00000000 00000000
等于 -2147483648
。
您要添加到 -2147483648
的剩余 32 个会得到 -2147483616
的结果。
原始类型 int
是一个 32 位整数,只能存储从 -2^31
到 2^31 - 1
而 long
是一个 64 位整数,所以它可以显然存储了更大的值。
当我们计算int
的容量时,它从-2147483648
变为2147483647
。
现在你很疑惑..为什么我加了33
之后就变成了-2147483616
?
这是因为"reset"的数据排序超出了限制。
因此,2147483647 + 1
将导致 -2147483648
。从这里,您可以看到 -2147483648 + 32
将导致您的示例中的值为 -2147483616
.
Some extra info below:
除非你真的需要使用大于int容量的数字,否则总是使用int,因为它占用更少的内存space.
此外,如果您的数字大于 long,请考虑使用 BigInteger
。
希望对您有所帮助!