请解释下面的代码是如何工作的,因为我们知道java中的字节数据类型允许的范围是-128到127.
我的代码段是:
public class DataTypes {
public static void main(String args[]){
byte b = (byte)140;
System.out.println(b);
}
}
输出:-116
答案 0 :(得分:0)
字节在其内存空间中将有8位。使用此空间可以容纳256个值。这将从-128到127,包括0.为了支持此跨越,将使用two's compliment method以二进制格式表示字节值。 MSB( M ost S 明显 B 它)将确定符号(0
- 正& 1
- 负值)。
如果我们考虑140
的情况,我们会清楚地表示140
是否为1000 1100
二进制格式。请记住,MSB将确定该符号,1
表示该数字为负值,0
表示该值为正值。在这种情况下,我们有1
使其成为负数。
如果我们对这两个赞美应用逆向处理,我们首先会将0111 0011
反转为1
和0
s 0
至1
。然后通过添加1,我们得到0111 0100
,其等于十进制格式的116
。但MSB表示它是负值,因此-116
答案 1 :(得分:0)
也许这有助于解释。最高位确定变量的符号(正或负)。由于Java没有明确的' unsigned'你能做的最好的整数就是应用'按位'在显示之前对项目进行操作会强制它被视为未签名的......或者您可以使用它本身未签名的十六进制格式来显示它。
public class DataTypes {
public static void main(String args[]){
byte b = (byte)140;
System.out.println("hex value = "+String.format("0x%02X",b)+"\n");
System.out.println("dec value = "+String.format("%d",(b & 0xff))+"\n");
}
}
和
的结果hex value = 0x8C
dec value = 140
答案 2 :(得分:0)
140是int
。根据{{3}},它会转换为byte
,如下所示:
将有符号整数缩小转换为整数类型T只会丢弃除n个最低位之外的所有位
值为140的int
的最低8位是10001100,这是该字节的正确值,但由于其最高位(符号位)为1,因此为负。
答案 3 :(得分:0)
我认为,当你将整数(140)转换为byte时,整数值转换为无符号字节,然后b变量值转换为有符号字节。数字140被视为无符号值,因为该数字没有符号值指示符(+或 - )
关于无符号字节的注释(正确的值是左值的表示(在文件字节中)): 0-127 = 0-127 (-128) - (-1)= 128 - 255