如何获取属于超出范围的字节值?

时间:2015-05-08 08:25:50

标签: java casting

{double a = 295.04;
int b = 300;
 byte c = (byte) a;
 byte d = (byte) b;
 System.out.Println(c +" " + d);}

字节的存储大小是8位,最大正字节值是127.所以c不等于300.然后我尝试将300转换为二进制数。二进制数(300)有9位。我很困惑获得c和d的值。 为什么我得到c = 39和d = 44?

4 个答案:

答案 0 :(得分:2)

Byte是java中的原始数据类型。当我们分配大于字节值的东西时,它就像一个循环。

假设您在字节变量中输入了300。 在第一个循环后,字节变量以0,127表示,意味着128个地方// 300-128 = 172

在第二个周期后,字段变量以0,127表示,表示128位// 172-128 = 44

现在在第三个周期中它是44.我希望这将回答你的问题。

答案 1 :(得分:1)

你在这里四舍五入。

byte c = (byte) 295.04;
// will be rounded to 295 
// and then overflows +128 as 295 -> 39 (mod 256)

byte d = (byte) 300;
// overflows +128 as 300 -> 44  (mod 256)

显然,这些都是“有损”的转换。这就是为什么Java没有显式强制转换就不会让你这么做的原因。当你进行此演员表时,你应该考虑超出范围的值会发生什么。

答案 2 :(得分:0)

此代码打印出您所期望的内容:

public class Sample {
    public static void main(String[] args) {
        double a = 295.04;
        int b = 300;
        byte c = (byte) a;
        byte d = (byte) b;
        System.out.println(c + " " + d);
    }
}

您需要使用println而不是Println。我在IntelliJ中得到的输出是:39 44

答案 3 :(得分:0)

好吧,尝试理解一下这个概念:java中的字节范围是8位,这意味着它可以保存高达(2 ^ 8)的值,所以当您写的值大于256(即2 ^ 8)时,它是什么呢?这样做是因为它采用256的模。假设我要将300转换为字节,输出将是44(300%256)。类似地,对于任何整数n,字节等效为(n%256)。

美好的一天