Java переполнение имеет другой результат при расчете на калькуляторе, чем результат IDE? - PullRequest
2 голосов
/ 23 сентября 2019

Я не понимаю, где я ошибаюсь в вычислениях, которые я сделал, почему я получил другой результат для консоли IDE.Консоль получает результат 14464 для println для моего ShortTotal.Но с помощью ручного вычисления на калькуляторе я получил аналогичное число, но +1, которое было 14465?

Я понимаю, что такое максимальные и минимальные значения короткого типа.Вот что я сделал до сих пор:

Поскольку короткое максимальное значение составляет около 32,767.Так что снова идет к минимуму с оставшейся суммой.Так что на калькуляторе вы можете проверить это, выполнив: 1000 x (bytevalue+shortvalue + intvalue) = 80000.Поскольку 80,000 больше короткого максимального значения, оно переполняется остатком.80,000-32767 =47233 затем добавьте это значение обратно к минимуму: - 32768 + 47233 = 14465

Мне удалось приблизиться к значению 14464, но не знаю, почему я получаю 14465?

package com.company;

public class Main {

    public static void main(String[] args) {
   byte ByteValue = 10;
   short ShortValue = 20;
   int IntValue = 50;
   long LongTotal = 50000 + 10 * (ByteValue + ShortValue + IntValue);
        System.out.println(LongTotal);
//The issue in question is below.
        short ShortTotal = (short) (1000 * (ByteValue + ShortValue + IntValue));
      System.out.println(ShortTotal);
    }
}

1 Ответ

1 голос
/ 23 сентября 2019

Я не понимаю вашу путаницу.

80,000 как значение int дает следующий битовый шаблон:

00000000000000010011100010000000

Вырезание первых двух байтов дает следующий битшаблон для значения short:

0011100010000000

Если преобразовать в десятичное число, это:

14464

Или, если выразить это иначе: короткое замыкание может представлять 2 ^ 16 возможных значений:

80000 - (2^16) = 80000 - 65536 = 14464
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...