0

java中的余数运算符有问题:为什么:

(int)2147483648l % 10

给出一个负数(-8)?

4

6 回答 6

13

那是因为(int) 2147483648l-2147483648。你正在投射longtoint并且它超出了界限。

于 2013-05-15T06:32:24.587 回答
0

以下示例可能有用:

public class Example1
{
    public static void main(String args[])
    {
        int b = (int)2147483648l;
        System.out.println("Value of b: "+ b);
        System.out.println("Output1:  "+b % 10);

        long a = 2147483648l;
        System.out.println("Value of a: "+ a);
        System.out.println("Output2: "+ a % 10);
    }
}

输出

Value of b: -2147483648
Output1:  -8
Value of a: 2147483648
Output2: 8
于 2013-05-15T06:45:33.883 回答
0

铸造问题。由于变窄导致数据丢失。您正在将 long 转换为 int。

阅读有关转换的更多信息。

于 2013-05-15T06:35:39.930 回答
0

来自JLS

在二进制数值提升(第 5.6.2 节)之后,整数操作数的余数运算会产生一个结果值,(a/b)*b+(a%b)例如a

从 Narrowing Primitive Conversions JLS 5.1.3
So2147483648l将转换为 int ,-2147483648 然后基于(a/b)*b+(a%b) = a

价值应该是-8你得到的。

于 2013-05-15T06:36:09.247 回答
0

使用“long”代替“int”。您也可以在不进行类型转换的情况下使用它

于 2013-05-15T06:37:46.093 回答
0

您得到一个负数,因为您将 a 转换longint. 在您的情况下,一个可能的解决方法只是利用任何小数 x mod 10 只是小数点最低位(在个位)中的数字这一事实。例如,156 mod 10 是 6,因为 156 除以 10 是 15 + (6/10)。所以你可以做这样的事情

//get the number and make it a string
String numberAsString = String.valueOf(number);

//get the integer value of the last character in the string (basically the lowest place)
int mod10 = Integer.parseInt(numberAsString.charAt(numberAsString.length() - 1));

这适用于任何整数number,只要你想要的是number % 10

于 2013-05-15T06:49:04.117 回答