在Java中使用long转换为byte

时间:2011-04-11 16:00:28

标签: java casting integer overrun

我无法理解以下内容:

在java中,

long l = 130L;  
byte b = (byte)l;

如果我打印b的值,为什么我得到-126?长l的位代表是什么?

4 个答案:

答案 0 :(得分:13)

一个字节是一个8位的序列,这使得2 ^ 8个案例= 256.其中一半代表负数,即-128到-1。然后是0,大约一半,1到127表示正数。

130因为Int看起来像128 + 2,这是:

0000:0000 1000:0000 (128) 
0000:0000 0000:0010 (2) 
0000:0000 1000:0010 (130) 

然而,Byte只有8位数,并且赋值只是按位而来,但只是最后一位:

1000:0010 

第一位表示,它是负数。现在需要添加多少才能达到零?让我们逐步进行:

1000:0010 x + 
0000:0001 1 = 
----------------
1000:0011 (x+1) 

1000:0011 (x+1) +
0000:0001 1 = 
----------------
1000:0100 (x+2) 

让我们做更大的步骤。只需添加1,我们有零,但首先我们回到x:

1000:0010 x + 
0111:1101 y = 
--------------
1111:1111 

现在有一个转折点:我们再添加1,并获得零(加上溢出)

1111:1111 (x + y) + 
0000:0001 1
--------- 
0000:0000 0

如果(x + y)+ 1 = 0,则x + y = -1。有趣的是,减1不仅与1(0000:0001)相同,而且设置了“负标志”('1000:0001'),但看起来完全不同。但是,第一个位置总是告诉您符号:1始终表示负数。

但我们之前添加了什么?

0111:1101 y = ?

第一个位置没有1,所以它是正值。我们知道如何解构这个问题?

 ..f:8421 Position of value (1, 2, 4, 8, 16=f, 32, 64 in opposite direction)
0111:1101 y = ?
 ..f 84 1 = 1+4+8+16+32+64= 125

现在很明显:x + 125 = -1 => x = -126

您可以想象以圆圈组织的值,顶部为0(高正午),正值排列在0到5(但到127)的时钟上,以及底部的转折点( 127 + 1 => -128 [sic!]。)现在你可以顺时针方向,将1个引线添加到-127,-126,-125,... -3,-2,-1(在11 o'时钟),最后再次在顶部0。

对于较大的数字(小,int,长)需要更大的时钟,零始终在顶部,最大值和最小值始终在底部。但即使是一个字节也太大了,无法制作图片,所以我做了一个半字节,一个半字节:

bitpatterns of integer, arranged in circle form

你可以轻松填补图片中的漏洞,这是微不足道的!

顺便说一句:整件事并不叫做施法。仅在对象之间使用强制转换。如果你有一些东西,它实际上是一个子类型:

 Object o = new String ("casting or not?"); 

这只是一个赋值,因为String(总是)是一个Object。不涉及铸造。

 String s = (String) o; 

这是一个演员。更具体的类型。并非每个对象都是String。与整数提升有一个小关系,因为每个字节都可以无损转换为long,但不是每个long到byte。但是,即使是Byte和Long,Object-types也不会相互继承。

你只是没有得到警告,

byte s = (byte) 42;
long o = s; // no problem, no warning
byte b = (byte) o; // written like casting 

答案 1 :(得分:7)

字节用Java签名 - 因此值的范围是-128到127(包括端点)。

130作为long的位模式,当简单地截断为8位时,是-126作为字节的位模式。

另一个例子:

int x = 255;
byte b = (byte) x; // b is now -1

答案 2 :(得分:2)

你的意思是byte b = (byte)l

Java的类型是有符号的,因此字节允许介于-128和+127之间的数字。

答案 3 :(得分:0)

初学者理解: 1 字节 = 8 位 范围(源自 2 的补码系统)= [-2^(n-1) 到 2^(n-1)-1],其中 n 为否。位 所以范围是 -128 到 127

每当值增加超过可能的最高 +ve 值时,流程就会转到可能的最低 -ve 值。

所以在值达到 127 后,流继续从 -128 到 -127 到 -126 覆盖 130 的总空间,因此 o/p 是 -126