我知道Java不允许使用无符号类型,所以我想知道它是如何将整数转换为字节的。假设我有一个值为255的整数a,我将整数转换为一个字节。值是否以字节11111111表示?换句话说,将值更多地视为带符号的8位整数,还是直接复制整数的最后8位?
答案 0 :(得分:20)
这称为narrowing primitive conversion。根据规范:
将有符号整数缩小转换为整数类型 T 只会丢弃除 n 最低位之外的所有位,其中 n 是用于表示类型 T 的位数。除了可能丢失有关数值大小的信息之外,这可能会导致结果值的符号与输入值的符号不同。
所以这是你列出的第二个选项(直接复制最后8位)。
我不确定你是否知道如何表示有符号的整数值,所以为了安全起见我会指出{{3}中的字节值1111 1111等于-1系统(Java使用)。
答案 1 :(得分:4)
还是直接复制最后一个 8位整数
是的,这就是这个演员的工作方式
答案 2 :(得分:4)
int i = 255;
byte b = (byte)i;
因此,以十六进制表示的值为0xFF,但十进制值为-1。
int i = 0xff00;
byte b = (byte)i;
b的值现在是0x00。这表明java占用了整数的最后一个字节。即。最后8位,但这是签名。
答案 3 :(得分:1)
只是想一想:在转换为 0xFF (对于整数)的字节时,始终屏蔽整数。 (假设myInt被赋值为0到255)。
e.g。
char myByte = (char)(myInt & 0xFF);
为什么呢?如果myInt大于255,则仅对字节进行类型转换会返回一个您不想要的负值(2的补码)。
答案 4 :(得分:1)
根据我的理解,你的意思是
Integer i=new Integer(2);
byte b=i; //will not work
final int i=2;
byte b=i; //fine
最后
Byte b=new Byte(2);
int a=b; //fine
答案 5 :(得分:1)
字节是8位。 8位可以代表256个数字。(2提升到8 = 256)
现在第一位用于标志。 [如果为正则则第一位= 0,如果负第一位= 1]
假设您要将整数1099转换为字节。只需将1099除以256.余数是int的字节表示
示例
1099/256 =>余数= 75
-1099/256 =>余数= -75
2049/256 =>余数= 1
原因?看看这张图片http://i.stack.imgur.com/FYwqr.png
答案 6 :(得分:0)
for (int i=0; i <= 255; i++) {
byte b = (byte) i; // cast int values 0 to 255 to corresponding byte values
int neg = b; // neg will take on values 0..127, -128, -127, ..., -1
int pos = (int) (b & 0xFF); // pos will take on values 0..255
}
将包含大于127的值(即,值0x80到0xFF)的字节转换为int导致字节值的高位(即位0x80)的符号扩展。要删除“额外”一位,请使用x&amp; 0xFF的;这会强制高于0x80的位(即,位0x100,0x200,0x400,...)为零,但保留低8位。
你也可以写这些;它们都是等价的: int pos =((int)b)&amp; 0xFF的; //首先将b转换为int,然后剥离高位 int pos = b&amp; 0xFF的; //完成为int算术 - 不需要强制转换
Java在运算时自动“提升”大小(以位数为单位)小于int的整数类型为int值。这样做是为了提供更确定的结果(比如C,在规范中受到的限制较少)。
答案 7 :(得分:0)
以下片段将 int 强制转换为 byte 。如果整数的值大于 byte 的范围,则会对 byte 的范围取模(整数除以整数的余数)。
int a;
byte b;
// …
b = (byte) a;