5

现在 signed_int 最大值是 2,147,483,647 即 2^31 并且 1 位是符号位,所以

当我跑步时long a = 2,147,483,647 + 1;

它给出a = -2,147,483,648了答案..这很好。但是,24*60*60*1000*1000 = 86400000000(实际上)......在java中,24*60*60*1000*1000 it equals to 500654080..我知道这是因为整数溢出,但是什么处理使这个值来了,什么逻辑被Java用来获取那个数字。我也提到了这里

4

6 回答 6

4

像这样从左到右执行乘法

    int x = 24 * 60;    
    x = x * 60;     
    x = x * 1000; 
    x = x * 1000;

前 3 个操作产生 86400000,仍然适合 Integer.MAX_VALUE。但是最后一个操作产生 86400000000 ,即十六进制的 0x141dd76000 。大于 4 的字节被截断,我们得到 0x1dd76000。如果我们打印它

System.out.println(0x1dd76000);

结果将是

500654080
于 2013-07-02T09:32:18.823 回答
3

这是非常微妙的:在编写 时long a = 2147483647 + 1,首先使用 s 计算右侧,int因为您提供了int文字。但这会在转换为long. 所以从intto升职long对你来说太晚了。

为了规避这种行为,您需要通过后缀 L 将至少一个参数提升为长文字。

这适用于所有使用文字的算术运算(即乘法运算):您需要将其中一个提升为长类型。

通过查看可以看出您的乘法答案是 5006540​​80 的事实

long n = 24L*60*60*1000*1000;
long m = n % 4294967296L; /* % is extracting the int part so m is 500654080 
                             n.b. 4294967296L is 2^32 (using OP notation, not XOR). */

这里发生的事情是你正在使用 int 类型“日以继夜”。是的,您正在丢失进位位,但这与乘法无关。

于 2013-07-02T09:20:58.760 回答
1

因为 int 的范围是-2,147,483,648 到 2,147,483,647。因此,当您继续添加数字并且它超过最大限制时,它会从最左边的数字开始增益,即-2,147,483,648,因为它作为一个循环工作。您在问题中已经提到过。

同样,当您计算24*60*60*1000*1000时,根据 Maths应该得到 86400000000 。

但实际上发生的事情是这样的:

86400000000可以写成2147483647+2147483647+2147483647+2147483647+..36次+5006540​​80

因此,在将2147483647添加40 次后,结果为0,然后剩下 5006540​​80,最终结果为5006540​​80

我希望你清楚。

于 2013-07-02T09:54:24.640 回答
0

在你的 multiplicatoin 中添加 L。如果您添加 L 而不是在 Long 范围内乘以您,否则在 Integer 范围内溢出。尝试像这样繁殖。

24L*60*60*1000*1000

这给你一个正确的答案。

于 2013-07-02T09:18:28.360 回答
0

整数是 32 位长。为简单起见,让我们以一个 4 位长的数字为例。

它的最大正值将是:

0111 = 7 (first bit is for sign; 0 means positive, 1 means negative)
0000 = 0

它的最小负值是:

1111 = -8 (first bit is for sign)
1000 = -1

现在,如果我们称这种类型为fbitfbit_max则等于 7。

fbit_max + 1 = -8
because bitwise 0111 + 1 = 1111

fbit_min因此, to的跨度fbit_max为 16。从 -8 到 7。

如果您将类似的东西相乘7*10并将其存储在 中fbit,结果将是:

fbit number = 7 * 10 (actually 70)
fbit number = 7 (to get to from zero to max) + 16 (min to max) + 16 (min to max) + 16 (min to max) + 15 (the rest)
fbit number = 6
于 2013-07-02T09:27:29.007 回答
0
24*60*60*1000*1000 = 86400000000

使用 MOD 如下: 86400000000 % 2147483648 = 5006540​​80

于 2013-07-02T09:35:06.403 回答