剩余运算符给出否定结果

时间:2013-05-15 06:31:04

标签: java

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

(int)2147483648l % 10

给出一个负数(-8)?

6 个答案:

答案 0 :(得分:13)

那是因为(int) 2147483648l-2147483648。您正在将long转换为int并且它已超出范围。

答案 1 :(得分:0)

投射问题。由于缩小导致数据丢失。您将long转换为int。

详细了解conversion

答案 2 :(得分:0)

来自JLS

  

二进制数字提升(第5.6.2节)后整数操作数的余数运算产生的结果值使(a/b)*b+(a%b)等于a

来自缩小原始转换JLS 5.1.3
因此,2147483648l将转换为-2147483648的int,然后基于(a/b)*b+(a%b) = a

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

答案 3 :(得分:0)

使用“long”代替“int”。 你也可以使用它而无需进行类型转换

答案 4 :(得分: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

答案 5 :(得分:0)

您收到一个负数,因为您正在将long转换为int。在你的情况下可能的解决方法只是利用这样的事实,即任何十进制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