溢出在java中是如何工作的?

2022-09-02 19:45:40

我读过关于溢出的文章,我知道“溢出是当一个数字太大以至于它不再适合数据类型时,因此系统”环绕“到下一个最低值并从那里开始计数”。

例如:

short s = (short)1921222; // Stored as 20678

在该示例中,我们从 -32768 开始计数,但是当我尝试用另一种整数数据类型进行证明时,它似乎的工作方式不同...(Short.MIN_VALUE)

byte b = (byte)400; // Stored as -112

上面的例子从0开始计数,这是我找到得到-112的唯一方法。

我不知道我是否做错了什么。


答案 1

Java语言规范说:

整数类型包括字节、短整型、整型和长整型,其值分别为 8 位、16 位、32 位和 64 位有符号二进制补码整数,以及 char,其值是表示 UTF-16 代码单位的 16 位无符号整数。

所以,并且都是二的补码整数。shortbyte

short为 16 位,这意味着它可以容纳 2^16 = 65536 个不同的值。在第 65536 个值之后,它将溢出。
1921222模65536是20678。这小于32768(2^ 15,两者补码的转折点),因此我们保持一个正数。

byte为 8 位,这意味着它可以容纳 2^8 = 256 个不同的值。这个在第 256 个值之后溢出。400模256是144。该值高于128,这是两者补码的转折点 - 因此它将被解释为负二的补码数。


答案 2

演员正在截断数字。(JLS))

0000 0001 1001 0000

失去高字节成为

1001 0000

即 -112。


推荐