gpt4 book ai didi

java - 在 Java 中将 long 转换为 byte

转载 作者:搜寻专家 更新时间:2023-11-01 03:59:03 25 4
gpt4 key购买 nike

我无法理解以下内容:

在Java中,

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

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

最佳答案

一个字节是一个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)

然而,字节只有 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 不仅与设置了“负标志”('1000:0001') 的 1 (0000: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 再次出现在顶部。

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

bitpatterns of integer, arranged in circle form

你可以很容易地填补图片中的空洞,这是微不足道的!

顺便说一句:整个过程并不称为转换。转换仅在对象之间使用。如果你有一些东西,它实际上是一个子类型:

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

这只是一个赋值,因为字符串(总是)是一个对象。不涉及类型转换。

 String s = (String) o; 

这是一个铸件。到更具体的类型。并非每个对象都是字符串。与整数提升有很小的关系,因为每个字节都可以无损地转换为长整数,但不是每个长整数都可以无损地转换为字节。然而,即使对象类型 Byte 和 Long 也不是相互继承的。

你只是没有收到警告,因为

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

关于java - 在 Java 中将 long 转换为 byte,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5624101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com