long转byte java_java - 在Java中使用long转换为byte - 堆栈内存溢出

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

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 [原文如此!]。现在你可以顺时针方向前进,将1个引线添加到-127,-126,-125,... -3,-2,-1(11点钟位置),最后0再次位于顶部。

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

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

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

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

你可能感兴趣的:(long转byte,java)