Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Преобразование данных


Автор: GIK 24.12.2005, 16:12
Всем привет.
Вот возникли пара простеньких вопросов по типам данных.
1) Еслть ли логика и смысл в преобразование больших данных в меньшие. Например int в byte.

Код

int i=257;
byte b;
b = (byte) i;

как вам извесно byte имеет диапазон до 256, и алгоритм преобразование выглядит так: 257%256 (остаток деления числа на максимально)что дает 1.

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

2) Далее, когда я увидел это:
Код

byte d=10;
byte b=10;
d=(byte) (10*10);

я совсем запутался, т.к. итог вроде как 100, а я ждал 100%256, учитывая вышеуказанное утверждение.
Разве я не прав?

Автор: COVD 24.12.2005, 16:57
1. byte имеет диапазон -128..127
2. 10*10 для компилятора означает перемножение двух int чисел и результат будет тоже целое.
3. преобразование (кастинг) необходимо, иначе компилятор выдаст ошибку - сообщение о возможной потери точности в операции присваивания. Делая кастинг вы даете знать компилятору, что вы в курсе о возможной потери данных.

Автор: GIK 24.12.2005, 17:30
Цитата
10*10 для компилятора означает перемножение двух int чисел и результат будет тоже целое.

Вот я о том же.
int значение переобразуется в byte не по алгоритму 100%127
Результат d=(byte) (10*10); = 100
А почему?
Цитата
byte имеет диапазон -128..127

Да, чет меня сглючило с этими остатками от деления

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

Вопрос не в этом, вопрос в том что логики и смысла преобразований int в byte к примеру на мой взгляд нету. Сам посуди, результат - это остаток от деления, не зависимо от начального число, будь то 10000 или 453.


Автор: COVD 24.12.2005, 19:19
Честно говоря, вникать в алгоритм преобразования смысла нет. smile

Если целое число лежит в диапазоне -128..127, (например, 100) то присваивание произойдет без ошибок. Если же написать
Код

byte b = (byte)(20*20);


то, естественно b не будет равно 400, так как это выходит за пределы допустимых значений byte. И какая разница, какой алгоритм и чему b будет равен? Целое уже нельзя однозначно восстановить, т.е. произошла потеря данных.

Логика использования кастинга только в том, что , как я уже сказал, что программист сообщает компилятору, что он знает, что при присвоении целого числа байту возможна ошибка. После этого компилятор снимает с себя всякую ответственность за результат.

Автор: LSD 25.12.2005, 00:56
Цитата(GIK @ 24.12.2005, 16:12)
Еслть ли логика и смысл в преобразование больших данных в меньшие.

Только если нужна реальная экономия памяти, т.е. ты например используешь большие массивы чисел (порядка 10^6 и более), тогда действительно имеет смысл задуматься об экономии памяти. Иначе смысла нет, т.к. 32-х битные процессоры наиболее эффективно работают с 32-х разрядными числами.

Автор: GIK 25.12.2005, 11:29
По второму вопросу понял.
Значит результат менее максимального диапазона не конвертица.

ЗЫ
Не подскажете какую литературу можно приобрести, чтобы разузнать как все ЭТО работает в корне. Т.е. все о байтах, где и как они хранятся, как происходит вычисления чисел когда они, к примеру, перемножаются.
Я считаю что все это нужно, чтобы стать настоящим профессионалом.
Всем спаибо за внимание smile

Автор: LSD 25.12.2005, 11:36
Цитата(GIK @ 25.12.2005, 11:29)
Не подскажете какую литературу можно приобрести, чтобы разузнать как все ЭТО работает в корне. Т.е. все о байтах, где и как они хранятся, как происходит вычисления чисел когда они, к примеру, перемножаются.

В спецификации JVM это не оговорено. Каждая реализация может это делать так как считает нужным, просто требуется чтобы результат был определенным и все.

Обычно это реализуют так, как быстрее всего для данной платформы. Т.е. на x86 совместимых машинах, int хранятся как little-endian, а на UltraSparc и PowerPC как big-endian, и т.д. Если интерестно возьми учебники по ассемблеру и почитай, там объясняется архитектура процессора и как происходят вычисления, лично мне понравился Рудаков, Финогенов - Программируем на языке ассембрера IBM PC.
Добавлено @ 11:42
Совсем забыл! Есть еще замечательная книжка: Э.Таненбаум Архитектура компьютера. Там рассматриваются и сравниваются все современные архитектуры компьютеров.

Автор: GIK 25.12.2005, 12:46
Большое спасибо.
Приобрету обязательно smile

Автор: redrick 25.12.2005, 16:11
GIK
она тооолстая и дорогая =)

Автор: x64 25.12.2005, 20:36
Цитата(LSD @ 25.12.2005, 00:56)
Иначе смысла нет, т.к. 32-х битные процессоры наиболее эффективно работают с 32-х разрядными числами.

У меня теперь 64-битный процессор, AMD x64, что мне теперь делать?

Автор: LSD 25.12.2005, 22:16
Цитата(x64 @ 25.12.2005, 20:36)
У меня теперь 64-битный процессор, AMD x64, что мне теперь делать?

Для начала у тебя должна стоять 64-х разрядная ОС и 64-х разрядная JVM, иначе не стоит даже пытаться.

А дальше наваяй некий тестик (например перемножение 2-х матриц) и попробуй посмотреть с каким типом int или long происходит быстрее.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)