С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,210

Действия над разными типами данных

22.06.2019, 20:51. Показов 2266. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Лет так 20 использую языки Assembler, C++, Pascal, LD. Однако, для организации сетевого общения "моих железок" хотелось бы освоить что-то более приспособленное для этих целей. Выбор пал на Java (может я и не прав...). Поэтому сегодня начал изучать Java.
Синтаксис языка понятен (похож на C#), но не могу разобраться с приведением типов данных. В справочнике Г.Шилда на стр. 70 есть пример определения расстояния, который свет проходит за 1000 дней. Решил немного усложнить:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MyApplication_2 {
 
    public static void main(String[] args) {
        byte huar=24, m=60, s=60; // Часы, минуты, секунды.
        short n=1000; // Количество дней.
        int v=300000; // Скорость света км/сек.
        long l; // Расстоянен, куда ппрйдёт свет за 1000 дней.
        l=v*n*huar*m*s; // Результат = -127631360!
        System.out.println("За 1000 дней свет пройдёт на расстояние "+l+" километров.");
        l=(long)(v*n*huar*m*s); // То же самое = -127631360, хотя по всей логике должно быть 25920000000000!
        System.out.println("За 1000 дней свет пройдёт на "+l+" километров.");
//-----------------------------------------------------------
        byte a=7, b=5;
        byte c=(byte)(a+b); // Зачем, если результат не превышает 12?
        System.out.println("7+5="+c);
        
    }  
}
Строка № 8 - хорошо, без явного указания типа может дать ошибку (хотя должна, по идее, "ругаться").
Строка № 10 - почему-то тоже даёт неправильный результат...? По логике того же C++ или Pascal, результат должен был быть приведён к "long" и выдать 25920000000000. Если, разумеется, я разобью на куски, то результат будет правильный (с аналогичной проблемой я уже сталкивался в C++Builder-6, хотя Delphi-6 считал правильно). Но это же не дело для столь "серьёзного языка"...
Строка № 14 - это вообще меня удивило: должно быть
Java
1
byte c=a+b;
но без явного указания типа результата - "ругается".
Просмотрел массу литературы и ссылок в сети, но так и не понял этих тонкостей: то ли мой "косяк", то ли есть у Java какие-то специфические особенности...
Прошу помощи...
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.06.2019, 20:51
Ответы с готовыми решениями:

Как передать несколько параметров с разными типами из файла в List?
привет друзья хотелось бы понять как передать несколько параметров с разными типами из файла в List вот код: public class Shop { ...

Необходимо преобразовать данные в массиве с разными типами
import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import...

Массив с разными типами данных
Нужно создать массив, с разными типами данных т.е., чтобы пользователь мог сам определить тип массива при вводе. #include...

4
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,764
22.06.2019, 22:37
Лучший ответ Сообщение было отмечено Welemir1 как решение

Решение

Цитата Сообщение от shyub Посмотреть сообщение
// Зачем, если результат не превышает 12?
Это ты знаешь, что он не превышает 12 в данном конкретном случае. А язык — нет. Т.к. для него в выражении (a+b) известно только, что a и b — это какие-то byte. Но оператор сложения определён только для int и long (ну и String, но это совсем другая история). Поэтому выражение (a + b) имеет тип int и его нужно явно приводить к byte, т.к. это может привести к потере данных и автоматически делать такое нельзя.

Цитата Сообщение от shyub Посмотреть сообщение
(хотя должна, по идее, "ругаться")
На что? int свободно автоматически преобразуется к long без потерь.

Цитата Сообщение от shyub Посмотреть сообщение
Java
1
l=(long)(v*n*huar*m*s); // То же самое = -127631360, хотя по всей логике должно быть 25920000000000!
По какой такой всей логике, расскажи мне.

Цитата Сообщение от shyub Посмотреть сообщение
По логике того же C++ или Pascal
А по логике какого-нибудь Forth'а это вообще непонятный набор символов. При чём тут C++ и Pascal?

Цитата Сообщение от shyub Посмотреть сообщение
Но это же не дело для столь "серьёзного языка"
В этом «серьёзном языке» сделано правильно, очевидно и предсказуемо: арифметическое выражение имеет тип int, если все его аргументы имеют тип int или short или byte. В выражении
Цитата Сообщение от shyub Посмотреть сообщение
Java
1
l = (long) (v*n*huar*m*s);
ты преобразуешь результат выражения (v*n*huar*m*s) в long, а само выражение и его результат имеет тип int. Понимаешь, какой порядок? Сначала вычисляется результат выражения, а уже потом он кастуется в long. В данном случае совершенно бессмысленно, т.к. он и так спокойно помещается в long. Собственно как в строке №8.

Добавлено через 4 минуты
Цитата Сообщение от shyub Посмотреть сообщение
Просмотрел массу литературы и ссылок в сети, но так и не понял этих тонкостей
https://docs.oracle.com/javase... jls-5.html
4
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,210
23.06.2019, 08:42  [ТС]
Korvin, спасибо. Вы помогли разобраться с этими тонкостями.
Ниже выкладываю код с подробным объяснением, может кому-нибудь пригодится.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class MyApplication_2 {
 
    public static void main(String[] args) {
        byte a=7, b=5;
        int i=a+b; // Без преобразования типа, т.к. получатель int.
        System.out.println("7+5="+i);
        byte c=(byte)(a+b); // Должно быть приведение типов.
        System.out.println("7+5="+c);
        c=(byte)(a/b);
        System.out.println("7:5="+c);
        c=(byte)(a%b);
        System.out.println("Остаток от 7:5="+c);
        // Математические операции над целыми числами определны для 
        // int и long. Поэтому результатом операции будет число int.
        // Соответственно, если необходимо получить результат bytе
        // или short, то надо явно осуществить преобразование типа.
        //-----------------------------------------------------------
        byte huar=24, m=60, s=60; // Часы, минуты, секунды.
        short n=1000; // Количество дней.
        int v=300000; // Скорость света км/сек.
        long l; // Расстоянен, куда ппрйдёт свет за 1000 дней.
        l=v*n*huar*m*s; // = -127631360 !
        System.out.println("За 1000 дней свет пройдёт "+
                "расстояние "+l+" километров.");
        l=(long)(v*n*huar*m*s); // = -127631360 результат!
        System.out.println("За 1000 дней свет пройдёт "+
                "расстояние "+l+" километров.");
        l=v*n*huar*m*(long)s;
        System.out.println("За 1000 дней свет пройдёт "+
                "расстояние "+l+" километров.");
        // 1. В первом случае получается число -127631360, т.к. ком-
        // пилятор выполняет действия над всеми числами, как над int.
        // 2. Во втором случае аналогично компилятор выполняет все 
        // действия, как над int, а затем полученный результат из int
        // переводит в long.
        // 3. Раз одно из чисел является long "=(long)v*", то компи-
        // лятор выполняет все действия, как над числами long.
        // Причём, если написать "l=v*n*huar*m*(long)s;", то получится
        // результат -107501813760, т.к. "v*n*huar*m" будут умножаться
        // как числа int и только при последнем действии, увидев число
        // long, компилятор выделит дополнительную память и произведёт
        // умножение, как над числами long.
    }   
}
Добавлено через 9 минут
Извиняюсь, строку 28 читать, как
Java
1
l=(long)v*n*huar*m*s;
или
Java
1
l=v*(long)n*huar*m*s;
0
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
23.06.2019, 15:12
Цитата Сообщение от shyub Посмотреть сообщение
В справочнике Г.Шилда на стр. 70 есть пример определения расстояния, который свет проходит за 1000 дней
Судя описанию задачи вы читаете неизвестную мне книжку Шилдта, однако все возникшие у вас вопросы очень подробно и доходчиво расписаны у Шилдта в этих учебниках:
Шилдт Г. - Java 8. Полное руководство. 9-е издание. На страницах 90-94
Шилдт Г. - Java 8. Руководство для начинающих. 6-е издание. На страницах 80-83
1
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,210
25.06.2019, 06:30  [ТС]
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.06.2019, 06:30
Помогаю со студенческими работами здесь

Работа с разными типами данных
Вот написал код, который выводит таблицу Пифагора :using System; namespace Cons { class Program { static void...

Массив с разными типами данных
Нужно создать таблицу в памяти, но чтобы одни столбец был с типом String, а другие double. Т.е. что-то типа таблицы БД. Подскажите,...

Переписать программу с разными типами данных
Тема: Использование указателей для работы со сложными типами данных Вот я хочу чтобы мне помогли переписать эту программу чтобы она...

Оператор сложения с разными типами данных
Здравствуйте. Я в JavaScript только недавно, поэтому некоторых тонкостей не знаю. Скажите, будут ли иметь смысл следующие выражения,...

Реализация Fifo с разными типами данных
Доброго времени суток! Задача следующая: Есть абстрактный класс CData, от него наследуются классы CByte, CWord, CNumber. Нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru