如何获取属于范围之外的字节值?

How to get value of byte that belongs to out of range?

提问人:vimukthi hett 提问时间:5/8/2015 最后编辑:vimukthi hett 更新时间:11/12/2023 访问量:15166

问:

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

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

Java 转换

评论

1赞 Jon Skeet 5/8/2015
“我怎样才能得到”,你的意思是“我为什么得到”?你发布了无法编译的代码,这无济于事,这表明你真正拥有的任何代码都是不同的。

答:

0赞 akhil_mittal 5/8/2015 #1

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

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);
    }
}

您需要使用而不是.我在 IntelliJ 中得到的输出是:.printlnPrintln39 44

评论

0赞 akhil_mittal 5/8/2015
不使用 IDE 是什么意思?代码将输出相同的代码,因为它不依赖于 IDE。
0赞 Sagar Rout 5/8/2015
@vimukthihett尝试在 cmd 提示符下编译此代码,它仍然会显示 39 44。
0赞 akhil_mittal 5/8/2015
好吧,op 问道:它确实做到了。我仍然找不到任何合乎逻辑的理由投反对票?How can I get c = 39 and d = 44 ?
0赞 akhil_mittal 5/8/2015
这个问题后来发生了变化,因此不能对此投反对票。
1赞 Thilo 5/8/2015 #2

你在这里四舍五入和溢出。

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 不允许在没有显式强制转换的情况下这样做的原因。在进行此强制转换时,应该已考虑超出范围的值会发生什么情况。

评论

0赞 vimukthi hett 5/8/2015
是的,将 +128 溢出为 295,但我如何获得 39
0赞 Thilo 5/8/2015
295 不适合字节。因此,它扔掉了除低 8 位之外的所有内容,剩下 39 位。
3赞 Sagar Rout 5/8/2015 #3

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

假设您在字节变量中输入了 300。 在第一个周期字节变量之后,以 0,127 表示 128 位 // 300-128 = 172

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

现在在第三个周期中,它是 44。我希望这能回答您的问题。

0赞 Priyank Rajvansh 11/9/2020 #4

好吧,试着理解这个概念:Java 中的字节范围是 8 位,这意味着它可以保存高达 (2^8) 的值,所以当你写一个比 256(即 2^8)更强的值时,它的作用是它的模数为 256。假设如果我想将 300 转换为字节,输出将为 44(300%256)。同样,对于任何整数 n,字节等效值为 (n%256)。

日安

0赞 sonali more 11/7/2023 #5
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);
}

我们在这里使用(缩小)类型转换。字节的范围是 -128 到 127.so 很难计算。byte 由上述范围的 cyle 组成,因此 c=39 和 d=44。