| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Преобразование данных |
| Автор: GIK 24.12.2005, 16:12 | ||||
| Всем привет. Вот возникли пара простеньких вопросов по типам данных. 1) Еслть ли логика и смысл в преобразование больших данных в меньшие. Например int в byte.
как вам извесно byte имеет диапазон до 256, и алгоритм преобразование выглядит так: 257%256 (остаток деления числа на максимально)что дает 1. Используется ли в практике преобразование больших данных в меньшее? 2) Далее, когда я увидел это:
я совсем запутался, т.к. итог вроде как 100, а я ждал 100%256, учитывая вышеуказанное утверждение. Разве я не прав? |
| Автор: COVD 24.12.2005, 16:57 |
| 1. byte имеет диапазон -128..127 2. 10*10 для компилятора означает перемножение двух int чисел и результат будет тоже целое. 3. преобразование (кастинг) необходимо, иначе компилятор выдаст ошибку - сообщение о возможной потери точности в операции присваивания. Делая кастинг вы даете знать компилятору, что вы в курсе о возможной потери данных. |
| Автор: GIK 24.12.2005, 17:30 | ||||||
Вот я о том же. int значение переобразуется в byte не по алгоритму 100%127 Результат d=(byte) (10*10); = 100 А почему?
Да, чет меня сглючило с этими остатками от деления
Вопрос не в этом, вопрос в том что логики и смысла преобразований int в byte к примеру на мой взгляд нету. Сам посуди, результат - это остаток от деления, не зависимо от начального число, будь то 10000 или 453. |
| Автор: COVD 24.12.2005, 19:19 | ||
| Честно говоря, вникать в алгоритм преобразования смысла нет. Если целое число лежит в диапазоне -128..127, (например, 100) то присваивание произойдет без ошибок. Если же написать
то, естественно b не будет равно 400, так как это выходит за пределы допустимых значений byte. И какая разница, какой алгоритм и чему b будет равен? Целое уже нельзя однозначно восстановить, т.е. произошла потеря данных. Логика использования кастинга только в том, что , как я уже сказал, что программист сообщает компилятору, что он знает, что при присвоении целого числа байту возможна ошибка. После этого компилятор снимает с себя всякую ответственность за результат. |
| Автор: LSD 25.12.2005, 00:56 | ||
Только если нужна реальная экономия памяти, т.е. ты например используешь большие массивы чисел (порядка 10^6 и более), тогда действительно имеет смысл задуматься об экономии памяти. Иначе смысла нет, т.к. 32-х битные процессоры наиболее эффективно работают с 32-х разрядными числами. |
| Автор: GIK 25.12.2005, 11:29 |
| По второму вопросу понял. Значит результат менее максимального диапазона не конвертица. ЗЫ Не подскажете какую литературу можно приобрести, чтобы разузнать как все ЭТО работает в корне. Т.е. все о байтах, где и как они хранятся, как происходит вычисления чисел когда они, к примеру, перемножаются. Я считаю что все это нужно, чтобы стать настоящим профессионалом. Всем спаибо за внимание |
| Автор: LSD 25.12.2005, 11:36 | ||
В спецификации JVM это не оговорено. Каждая реализация может это делать так как считает нужным, просто требуется чтобы результат был определенным и все. Обычно это реализуют так, как быстрее всего для данной платформы. Т.е. на x86 совместимых машинах, int хранятся как little-endian, а на UltraSparc и PowerPC как big-endian, и т.д. Если интерестно возьми учебники по ассемблеру и почитай, там объясняется архитектура процессора и как происходят вычисления, лично мне понравился Рудаков, Финогенов - Программируем на языке ассембрера IBM PC. Добавлено @ 11:42 Совсем забыл! Есть еще замечательная книжка: Э.Таненбаум Архитектура компьютера. Там рассматриваются и сравниваются все современные архитектуры компьютеров. |
| Автор: GIK 25.12.2005, 12:46 |
| Большое спасибо. Приобрету обязательно |
| Автор: redrick 25.12.2005, 16:11 |
| GIK она тооолстая и дорогая =) |
| Автор: x64 25.12.2005, 20:36 | ||
У меня теперь 64-битный процессор, AMD x64, что мне теперь делать? |
| Автор: LSD 25.12.2005, 22:16 | ||
Для начала у тебя должна стоять 64-х разрядная ОС и 64-х разрядная JVM, иначе не стоит даже пытаться. А дальше наваяй некий тестик (например перемножение 2-х матриц) и попробуй посмотреть с каким типом int или long происходит быстрее. |