我用Java编写了以下程序,将long转换为byte。
public class LongtoByte
{
public static void main(String[] args)
{
long a=222;
byte b=(byte)(a & 0xff);
System.out.println("the value of b is" +b);
}
}
问题是我得到变量b的结果-34。
请告诉我如何获得正确的价值。我只想要以字节为单位的值。
答案 0 :(得分:2)
Java的类型是有符号的,字节允许-128到+ 127之间的数字。这就是你得到-34为222值的原因
long a=121;
byte b=(byte)(a );
System.out.println("the value of b is" +b);
答案 1 :(得分:1)
所有整数类型(包括byte
)都是用Java签名的,所以如果你将222
粘贴到Java byte
中就会出现溢出(导致你看到的负数)。如果您需要使用Java中的整数0-255范围,则至少需要short
。
但是,如果您只是将结果写为单个字节,则无需担心,因为其位模式表示与222
中的unsigned byte
完全相同
答案 2 :(得分:0)
您可以使用java.lang.Long
类'byteValue()
方法:
byte b = a.byteValue();
您必须制作Long
类型的对象:
Long a = new Long(222);
正如其他人所指出的那样,由于可以用8位字节表示的范围溢出,这将返回-34。
答案 3 :(得分:0)
当您打印一个字节时,它假定范围为-128到127。
如果您打印
byte b = (byte) 222;
你应该得到一个负数。
如果要存储范围0到255,则需要在获得值时将其转换。
int i = 222;
byte[] b = { (byte) i };
int i2 = b[0] & 0xFF; // give me the original unsigned 0 to 255.
assert i == i2;
您可以发明各种编码。例如假设您要存储的数字仅为数百万,例如0到2亿或十进制数字-1.00到1.00(一个字节)。您可能首先认为这是不可能的,因为一个字节只存储8位。
// store millions.
byte b = (byte) (i / 1000000);
int i = (b & 0xff) * 1000000;
// store decimal from -1.00 to 1.00
byte b = (byte) Math.round(d * 100);
double d = b / 100.0;
答案 4 :(得分:-1)
public class LongtoByte
{
public static void main(String[] args)
{
long a=222;
byte b=(byte)(a);
System.out.println("the value of b is" +b);
}
}
此字节bValue =(byte)num;语句转换为字节格式。