当前位置: 首页 > 知识库问答 >
问题:

为什么我不能添加两个字节,得到一个int,我可以添加两个最后的字节得到一个字节?

霍弘厚
2023-03-14
public class Java{
    public static void main(String[] args){
        final byte x = 1;
        final byte y = 2;
        byte z = x + y;//ok
        System.out.println(z);

        byte a = 1;
        byte b = 2;
        byte c = a + b; //Compiler error
        System.out.println(c);
    }
}

如果一个表达式包含任何整数大小或更小的内容,其结果总是整数,即使两个字节之和适合一个字节。

为什么我们在一个字节中添加最后两个字节时会发生这种情况?没有编译器错误。

共有3个答案

洪德寿
2023-03-14

当我们在两个变量a之间进行任何算术运算时

max(int, type of a, type of b)

byte a=10;
byte b=20;
byte c=a+b(C.E )

说明:如上所述max(int,a型,b型)

max(int, byte, byte)

结果的类型为:int,find为int,但字节为必需

所以我们需要将类型转换为字节

    byte a=10;
    byte b=20;
    byte c=(byte) (a+b);
冀永寿
2023-03-14
byte z = x + y;  // x and y are declared final

这里,由于xy被声明为final,因此RHS上的表达式值在编译时是已知的,它固定在(1 2=3),并且不能改变。所以,你不需要显式地进行类型转换

byte c = a + b;   // a and b are not declared final

然而,在这种情况下,ab的值不是最终值。因此,表达式的值在编译时是未知的,而是在运行时计算的。所以,你需要做一个明确的演员阵容。

然而,即使在第一个代码中,如果ab的值超出了-128到127的范围,它也将无法编译。

final byte b = 121;
final byte a = 120;
byte x = a + b;  // This won't compile, as `241` is outside the range of `byte`

final byte b1 = 12;
final byte a1 = 12;
byte x1 = a1 + b1;  // Will Compile. byte can accommodate `24`

微生善
2023-03-14

从JLS 5.2任务转换

此外,如果表达式是字节、短、char或int类型的常量表达式(§15.28):-如果变量的类型是字节、短或char,并且常量表达式的值可在变量的类型中表示,则可以使用缩小基元转换。

简而言之,表达式的值(在编译时是已知的,因为它是一个常量表达式)可以用字节的变量类型来表示。

考虑一下你的表情

 final byte x = 1;
 final byte y = 2;
 byte z = x + y;//This is constant expression and value is known at compile time

因此,由于求和适合字节,所以不会产生编译错误。

现在如果你这么做

final byte x = 100;
final byte y = 100;
byte z = x + y;// Compilation error it no longer fits in byte
 类似资料:
  • 我只知道几件事:(1),我正在为其编写适配器的硬件需要两个字节的CRC值。(2),CRC包的作者说明uint64可以显示为0xFFFF,即两个字节。(3)在线CRC计算器将这些值显示为两个字节,例如https://www.lammertbies.nl/comm/info/crc-calculation.html。其余的对我来说都是新的... 我刚刚发布了CRC包自述文件中的一个片段。由于uint6

  • 看看以下片段: 结果如下: 无符号短常量

  • 这有点难以解释,但基本上,我很难为一个数字的每一个数字添加单词“really”。 所以就像 “那是一个真的(真的数量取决于一个数字的位数)大数字!” 所以如果我把1563块印出来 这是一个真的真的真的真的很大的数字!

  • 问题内容: 为什么我添加到ArrayList中对象只包N个最后一个元素? 问题答案: 此问题有两个典型的原因: 你存储在列表中的对象使用的静态字段 意外将同一对象添加到列表 静态场 如果列表中的对象将数据存储在静态字段中,则列表中的每个对象将看起来是相同的,因为它们具有相同的值。考虑下面的类: 在该示例中,由于声明了,因此在所有实例之间只有一个共享。(请参阅“了解班级成员”教程。) 如果使用以下代

  • 问题内容: 我正在使用rsa密钥对要发送到服务器的长字符串进行加密(将使用服务器的公钥和我的私钥对它进行加密),但是它抛出一个异常,就像 我觉得到目前为止我还不了解rsa的工作原理一样(使用内置库是造成这种情况的原因)。 可以请一个人解释为什么抛出此异常。根本不可能发送加密的长字符串吗? 问题答案: RSA算法只能加密具有以字节为单位的RSA密钥长度的最大字节长度除以8减去11的填充字节的数据,即

  • 为什么我不能在英特尔x86-64汇编中直接将一个字节从内存移到64位寄存器? 例如,此代码: 印刷品: 为了使代码正常工作,我需要将寄存器r12和r13的移动字节更改为: 现在,它打印出预期内容: 我们为什么要这样做? 有更简单的方法吗? 谢谢