LINUX.ORG.RU

java. Почему такой результат?

 , ,


0

1
package test1;


public class test1 {

    
   public static void main(String[] args) {
int x, y;
short z;
x = 30000;
y = 30000;
z = (short) (x + y);
System.out.println(z);
    }}

В результате в место 60000 мы получаем -5536, почему так, ясно что это значение превышает значение short, но почему получается именно -5536, и разве компилятор не должен выдать ошибку?

ЗЫ какой учебник по джаве посоветуете, для изучения с нуля



Последнее исправление: CYB3R (всего исправлений: 4)

Компилятор выдает синтаксические ошибки и внутрь переменных не лезет.

Ошибики подобного рода должен искать статический анализатор.

mono ★★★★★
()

30000 = 0x7530

0x7530 + 0x7530 = 0xea60 = 1110101001100000

Размер в битах - 16, начинается с 1 => отрицательный short. Все в порядке.

cdshines ★★★★★
()
Последнее исправление: cdshines (всего исправлений: 1)
Ответ на: комментарий от mono

Не работа синтаксического анализатора, хотел сказать ты. Компилятор, в широком смысле, это еще и оптимизатор (который, по-хорошему, здесь должен убрать переменные x и y), и статический анализатор.

buddhist ★★★★★
()

z = (short) (x + y);

(short)

разве компилятор не должен выдать ошибку

ССЗБ

anonymous
()

-5536 получается из-за того, что 16-битные (short) целые, большие 0111 1111 1111 1111b = 32767, имеют 1 в старшем разряде, который при хранении чисел в дополнительном коде (см. википедию) показывает знак числа. При таком способе хранения отрицательное число A получаются как двоичная запись разности «65536 - модуль A». То есть -5536 в битовой записи полностью совпадает с записью числа 60000, которое должно было бы получиться, не будь short знаковым.

Kiborg ★★★
()

Ты же его принудительно кастонул. Зачем уведомлять о ошибке?

observer ★★★
()

какую ошибку, ты сам сказал ему этим безобразием заняться.

почему -5536? потому что MAX_VALUE у тебя 32767 для шорта. 30000+30000

(еще нули)0111 0101 0011 0000
+
(еще нули)0111 0101 0011 0000
=
(обрезал)1110 1010 0110 0000

а твое 1110 1010 0110 0000 в шорте - это и есть -5536. 

смотри, 1) вычитаем единичку 1110 1010 0101 1111 2) инвертируем 0001 0101 1010 0000 == 5536, а первый бит за знак отвечает, ЕМНИП. 

так то, и вообще, иди читай

RedPossum ★★★★★
()

считай что когда юзаешь операции явного приведения - это твоя личная просьба компилятору отключить ошибки

если уберешь (short) он тебе ошибку покажет. Так покажет, что скомпилировать не сможешь.

stevejobs ★★★★☆
()

Хм ещё вопрос, влиет ли на потребление памяти значение long и short и насколько велико это влияние в реальной программе?

Deneb
() автор топика
Ответ на: комментарий от Deneb

long 64 short 16

Сколько переменных создашь, такое влияние на память и будет

Dantix ★★
()
Ответ на: комментарий от Deneb

Напишешь программу - посмотри профайлером.

cdshines ★★★★★
()
Ответ на: комментарий от Deneb

Хм ещё вопрос, влиет ли на потребление памяти значение long и short и насколько велико это влияние в реальной программе?

Не знаю по какой ты книжке учишься, но в яве все числа при необходимости переводятся в int (размер в байтах зависит от платформы). Используй int и не мучайся. У тебя объекты и вся ООП мишура сожрут в 10 раз больше ОЗУ, чем от таких вот оптимизаций.

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от Deneb

Если мы о java говорим, то посмотри накладные расходы на создание объектов и, в общем случае, расслабь булки и пиши код. Я бы на твоём месте больше внимания обращал на структуры данных.

RedPossum ★★★★★
()

Классика же «получаешь не то, чего хотел, а то о чем попросил» (с)

slackwarrior ★★★★★
()

В джаве переполнение не вызывает исключений. Проверяй сам результат, если надо.

Legioner ★★★★★
()

Это не ошибка. Даже в ядре есть штука, использующую эту особенность представления чисел. в смысле

unsigned char a = 254;
unsigned char b = a + 3;
if (b == 1) {
   puts("hallelujah!");
}

nanoolinux ★★★★
()
Ответ на: комментарий от Deneb

http://elizarov.livejournal.com/

из за одного long|short смысла заморачиватся нет.

а вот когда массив обьектов - то чел из выше привёденного блога тем и занимается , что раскладывает поля обьектов по массивам примитивных типов - для минимизации кэшмисов и прочая пипхол.

qulinxao ★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.