将任何值添加到最大整数值都会给出错误的计算

Adding any value to maximum integer value is giving wrong calculation

我正在添加两个号码 2147483647 和 45

public void checkIntAdd(){

int intMax =  2147483647;
int anyNumber  = 26;

int number = intMax+anyNumber;
System.out.println("Wrong Calculation -"+number);

}

我们应该回答

"2147483692

" 但它会以

的形式出现

-2147483604

我觉得它正在失去一些价值我觉得很好

但是当我用 short 尝试这种类型的东西时它给出了编译错误

public void checkShortAdd(){

short intMax =  214;
short anyNumber  = 26;

short number = intMax+anyNumber;  // error is coming Type mismatch: cannot convert from int to short
System.out.println("Wrong Calculation -"+number);

}

// error is coming Type mismatch: cannot convert from int to short

我无法理解它的原因。

当我向它添加强制转换时工作正常

short number = (short) (intMax+anyNumber);  

类似地,编译器应该给出错误,以便用户可以注意它会超出范围,就像在短的情况下

数字 1:第一个数字是 Java 中的最大整数大小。你可以用

得到这个
Integer.MAX_VALUE

您可以使用

 BigInteger reallyBig = new BigInteger("1234567890123456890");

数字2:在Java中,它在于语言的基本编码。简化,你可以说 short + short = int,所以你必须转换它才能得到正确的解决方案

来源:https://www.reddit.com/r/learnprogramming/comments/3refus/in_java_why_is_the_sum_of_2_shorts_an_int/

TL、DR...

这是有效的 short intMax = 214; 因为即使你 214 是一个 int 字面量,它也适合短...的范围,short anyNumber = 26; 也是如此 现在 java 编译器不能保证这个

short number =  intMax + anyNumber;

仍然可以适应短变量,所以你需要转换

short number = (short) (intMax + anyNumber);

根据java语言规范

Java 虚拟机指令集中的大多数指令都对有关它们执行的操作的类型信息进行编码。例如,iload 指令 (§iload) 将必须为 int 的局部变量的内容加载到操作数堆栈中。 fload 指令 (§fload) 对浮点值执行相同的操作。这两条指令可能具有相同的实现,但具有不同的操作码。

在此table中没有短字节字符的操作。

Java 虚拟机实际类型和 Java 虚拟机计算类型之间的映射为

其中表示 short 默认类型仅为 int

所以我只想深入了解我的程序,所以我只是 运行 作为

的命令
javap -verbose RunTimeS.class

并且输出包含

iload_1

正在加载该整数