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

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

22.06.2019, 20:51. Показов 2252. Ответов 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 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru