提问人:vimukthi hett 提问时间:5/8/2015 最后编辑:vimukthi hett 更新时间:11/12/2023 访问量:15166
如何获取属于范围之外的字节值?
How to get value of byte that belongs to out of range?
问:
{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 ?
答:
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 中得到的输出是:.println
Println
39 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。
评论