有人请解释一下。为什么下面的程序产生16个?
public static void main(String[] args) {
byte b1 = 60, b2 = 60;
byte product = (byte) (b1 * b2);
System.out.println(product);
}
请注意以下程序:
public static void main(String[] args) {
int b1 = 60, b2 = 60;
int product = (byte) (b1 * b2);
System.out.println(product);
}
如果您注意到,它与您的相同,但我使用的不是字节,而是int。然而,结果是一样的。问题是(byte)
,它只获取数字的最后8位。
事实上,你甚至可以使用多头,你会有相同的值。
因此,解释如下:
(byte)
转换缩小了范围,切割了数字的最后8位,丢弃了其余的。
因为60*60是111000010000,最后8位是00010000,而00010000是16位二进制,这就是结果。
要查看二进制表示中的数字,您可以使用以下命令:
System.out.println(60 +" is "+Integer.toBinaryString(60) + " in binary");
System.out.println((60*60) +" is "+Integer.toBinaryString(60*60) + " in binary");
System.out.println("(byte)(60*60) is "+Integer.toBinaryString((byte)(60*60)) + " in binary");
它输出这个:
60 is 111100 in binary
3600 is 111000010000 in binary
(byte)(60*60) is 10000 in binary
这是因为一个字节只能存储从-128到127的数字,并且超过了字节的最大存储空间,因此会产生整数溢出错误。要解决此问题,您可以使用:
public static void main(String[] args) {
byte b1 = 60, b2 = 60;
int product = b1 * b2;
System.out.println(product);
}
一个字节可以有8位(二进制数字),3600是二进制形式的11100001000。(12位),因此,开头的4个额外位被丢弃,以便可以放入一个字节,将二进制更改为00010000,而不是
111000010000,并且000100002=1610,因此您得到的是输出16,而不是所需的3600。
我有一个PySpark数据帧,df1,看起来像: 我有第二个PySpark数据帧,df2 我想将df1的所有列(我有两列以上)与客户ID上的df2连接值相乘
问题内容: 我有两个仅包含数字的字符串: 我本来希望可以将它们加在一起,但是它们被串联起来了: 如何强制将这些字符串视为数字? 问题答案: 我将使用一元加号运算符先将其转换为数字。
问题内容: 我有两个仅包含数字的字符串: 我本来希望可以将它们加在一起,但是它们被串联起来了: 如何强制将这些字符串视为数字? 问题答案: 我将使用一元加号运算符先将其转换为数字。
看看以下片段: 结果如下: 无符号短常量
问题内容: 我有一个带有〜已知二进制序列的字节数组。我需要确认二进制序列是应该的。除之外,我还尝试了其他方法,但均无济于事。 问题答案: 在您的示例中,您具有: 在处理对象时,java中会比较 参考值 。您正在检查对by返回的数组的引用是否与所保存的引用相同,这当然永远不会正确。此外,数组类不会覆盖,因此其行为仅是比较参考值。 为了比较两个数组的 内容 ,Arrays类提供了静态数组比较方法。
问题内容: 我有两个字节数组,我想知道如何将一个添加到另一个或组合它们以形成一个新的字节数组。 问题答案: 您只是想将两个数组连接起来? 或者您可以使用: 或者您可以使用a 来完成工作: 或者,您可以简单地利用添加多个数组的优势。