Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2017, 20:54   #1
StudentMarat
Форумчанин
 
Регистрация: 10.10.2008
Сообщений: 123
По умолчанию Преобразование и сужение чисел java

Всем привет. Изучаю java. Начал изучение с сайта javarush.ru
Разбираюсь сейчас с темой преобразования и сужения типов. Начал разбираться вот с таким примером:

Код:
double l = 111_1111_111.8d;
byte b = (byte) l;
System.out.println(b);
Как мы видим в данном примере. Переменную b нужно преобразовать в тип byte. Для этого, у переменной l дробная часть убирается. Далее, число 111_1111_111 в двоичной системе будет выглядеть вот так: 1000010001110100011010111000111

Судя по лекциям на javarush на 10 уровне, то там написано, что переменная типа byte занимает всего один байт памяти. Поэтому из этого числа берем последние восемь цифр: 1000010001110100011010111000111

Получилось такое число в двоичной системе: 11000111. В десятичной системе данное число равно 199. Далее из 199 отнимаем 256. Получится -57. Компилятор так и выводит. С этим я разобрался.

Далее разбираю следующий похожий пример:
Код:
double l = 111_1111_1118.8d;
byte b = (byte) l;
System.out.println(b);
Проделываю все абсолютно также. Число 111_1111_1118 в двоичной системе 1010010110010001100001100111001110. Беру последние восемь цифр, т.е. 11001110. В десятичной системе счисления данное число будет равно 206. Отнимаю 206-256 = -50. Радостно думаю, что у меня все правильно. Но облом. Компилятор выводит -1. И вот тут я застрял.

Подскажите, почему во втором примере компилятор вывел -1 ???

P.S. Строго не судите) Java где-то месяц изучаю)
Изображения
Тип файла: jpg Безымянный.jpg (52.8 Кб, 68 просмотров)

Последний раз редактировалось StudentMarat; 09.07.2017 в 22:07.
StudentMarat вне форума Ответить с цитированием
Старый 09.07.2017, 21:17   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Какая-то математика у вас не понятная...

Вот на С++

Код:
int main()
{
  unsigned char a = 206;
  
  std::cout << "Hello, " << (int)((char)a);
}
Цитата:
Hello, -50
А почему на яве -1 ...не должно, где-то чегото не так. Из фрагмента не видно.
alexzk вне форума Ответить с цитированием
Старый 09.07.2017, 21:40   #3
StudentMarat
Форумчанин
 
Регистрация: 10.10.2008
Сообщений: 123
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Какая-то математика у вас не понятная...

Вот на С++

Код:
int main()
{
  unsigned char a = 206;
  
  std::cout << "Hello, " << (int)((char)a);
}


А почему на яве -1 ...не должно, где-то чегото не так. Из фрагмента не видно.
C++ не изучал. Ничего не могу сказать. Только учусь на java.
Может, конечно, я и что-то не правильно понимаю, но всю свою логику (как я понял тему) я расписал. Не знаю, правильная она или нет. Вот и хочу выяснить.

Вот что мне вывел компилятор во втором моем примере (пользуюсь средой intellij idea):
Изображения
Тип файла: jpg Безымянный.jpg (73.6 Кб, 120 просмотров)
StudentMarat вне форума Ответить с цитированием
Старый 09.07.2017, 21:49   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Оно в обоих случаях не работает

Цитата:
alex@moy-super:~/Work/oDesk$ java -cp . MainC
1.11111111118E10
-1
alex@moy-super:~/Work/oDesk$ javac MainC.java
alex@moy-super:~/Work/oDesk$ java -cp . MainC
1.11111111188E10
-1
alexzk вне форума Ответить с цитированием
Старый 09.07.2017, 21:52   #5
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Код:
public static void main(String[] s)
    {
         double l = 111_1111_1118.8d;
         byte b = (byte) (long)l;
         System.out.println(l);
         System.out.println(b);        
    }
Вот так работает, но вообще - вот те замуты с double в byte луче прекратить. Компиляторы нынешние делают оптимизацию и она сильно все ломать такое может.
alexzk вне форума Ответить с цитированием
Старый 09.07.2017, 21:55   #6
StudentMarat
Форумчанин
 
Регистрация: 10.10.2008
Сообщений: 123
По умолчанию

Вот что в первом случае выводится у меня. Второй сообщением выше
Изображения
Тип файла: jpg Безымянный.jpg (73.5 Кб, 124 просмотров)
StudentMarat вне форума Ответить с цитированием
Старый 09.07.2017, 22:02   #7
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Перестаньте скрины лепить - копируйте нормально текст. Из-за скринов вы вон сообщение выше пропустили.
alexzk вне форума Ответить с цитированием
Старый 09.07.2017, 22:06   #8
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Вопщем трюк с отбрасыванием дроби не совсем корректен. Как видим работает только при одинаковой длине типа. Т.е. double = 8 байт, значит верно будет (long) = 8 байт. Лучше использовать методы классов:
https://stackoverflow.com/questions/...nteger-in-java
alexzk вне форума Ответить с цитированием
Старый 09.07.2017, 22:15   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
А почему на яве -1
так там byte не unsigned.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.07.2017, 22:49   #10
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
так там byte не unsigned.
ну должно получится -50. Вобще-то даже в INT (4 байта) дает -1.
alexzk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование к int (java) zhenya.ya Помощь студентам 1 10.12.2011 11:46
Растягивание/сужение формы Ko$ Общие вопросы Delphi 2 30.10.2011 12:53
преобразование чисел(delphi) mineralkaaa Помощь студентам 4 18.05.2010 13:00
Преобразование чисел artemavd Общие вопросы Delphi 15 30.07.2008 15:48
Преобразование дробных чисел Gon Помощь студентам 5 01.05.2008 13:12