{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?
答案 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)。
美好的一天