Вопрос № 82162: Возьмем такую достаточно незатейливую программку. Здесь я присваиваю переменной float значение. Меня теперь интересуют значения отдельных байтов ее. Когда я присваиваю переменной f (типа float) значение 1001 (дробная ч. равна нулю), то *a выводится к...Вопрос № 82264: Please, помогите мне решить задачки!!!!!!!!!!!...
Вопрос № 82.162
Возьмем такую достаточно незатейливую программку. Здесь я присваиваю переменной float значение. Меня теперь интересуют значения отдельных байтов ее. Когда я присваиваю переменной f (типа float) значение 1001 (дробная ч. равна нулю), то *a выводится как 16384. Это, я так понимаю, 4 байта переменной float, интерпретированные уже как unsigned int (мне именно это и нужно).
Но мне непонятно, почему *a равно 0 в случае если я введу 1000 или 10. Тоже самое произойдет, если я введу 3.5. Я вывожу не те байты? Если продолжить эксперименты, то значения указателей ff и a равны, а *ff выводит правильное значение. Чем тогда объяснить эти нули? Действительно ли *a указывает куда нужно? Или я вывожу не с теми ключами?
Также непонятно, почему при выводе *t, *(t+1), *(t+2) и *(t+3) с ключом %u выводятся совершенно страшные числа типа 65504 или 65529 (это в случае если на вход подано 374735). *t же занимает один байт? Как может один байт иметь такое значение?
Приложение:
Отправлен: 12.04.2007, 00:50
Вопрос задал: Blackie (статус: Посетитель)
Всего ответов: 5 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: ramok
Здравствуйте, Blackie!
Числа с плавающей имеют сложный формат, который определен стандартом IEEE.
Ответ отправил: ramok (статус: Практикант)
Ответ отправлен: 12.04.2007, 01:31 Оценка за ответ: 4 Комментарий оценки: Формат вещественных чисел мне давно известен. Интерес представляет адресовать 2-м переменным разного типа одни и те же байты. За примеры спасибо.
Думаю, что вы немного не верно определяете способ хранения переменной в памяти.
"Величина типа float занимает 4 байта. Из них 1 бит отводится для знака числа, 8 бит для порядка и 23 бита для мантиссы. Диапазон значений переменной от 3.14E-3 до 3.14E+3.""
То есть после того как вы считали 4 бита из памяти, вам надо их преобразовать, а именно получить самый первый бит 1го байта для определения знака, потом 8 бит для порядка. и оставшиеся 23 буду отвечать за порядок.
Ответ отправил: Пчелин Никита Игоревич (статус: 1-ый класс)
Ответ отправлен: 12.04.2007, 01:37 Оценка за ответ: 2 Комментарий оценки: Мне не нужно их преобразовывать. Мне нужно было получить доступ до тех 4- байт и вывести их как int. А он каждый раз 0.
Отвечает: Ross
Здравствуйте, Blackie!
Если вы выводите значение типа signed char (знаковое) с ключом %u (Unsigned decimal integer) то при отрицательных значениях t будут получаться огромные результаты, т.к. знаковый бит в таком случае интерпретируется как часть числа
Ответ отправил: Ross (статус: 7-ой класс)
Ответ отправлен: 12.04.2007, 10:46 Оценка за ответ: 5
Отвечает: kool
Здравствуйте, Blackie!
>>Когда я присваиваю переменной f (типа float)
>>значение 1001 (дробная ч. равна нулю),
>>то *a выводится как 16384. Это, я так
>>понимаю, 4 байта переменной float,
>>интерпретированные уже как
>>unsigned int (мне именно это и нужно).
Вероятно у тебя компилятор создает 16 битный код.
Короче у тебя sizeof(unsigned int)==2.(Проверь).
А там (случай f=1000 и f=10) как раз первые два байта нулевые.
Нужно так unsigned long *a.
--------------------------------------------
Все правильно выводятся.
Чтобы выводились красиво нужно или
делать преобразование типов или
сразу задавать другой тип( см. приложение.)
Совет - пользуйся отладчиком, там все это очень хорошо видно.
Удачи!
Приложение:
--------- I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 12.04.2007, 10:47 Оценка за ответ: 5 Комментарий оценки: Да, проблема похоже в 16-битном коде
Отвечает: Ilkras
Здравствуйте, Blackie!
Если вы пользуетесь Mocrosoft C++, то там числа float представляются в соответсвие с IEEE. Для того чтоб "посмотреть нутро" или записать туда можно воспользоваться определить bitfield тип, сделать на него кастинг и тогда уже писать что-нибудь в мантиссу и что-нибудь в экспоненту. Однако есть нюанс - эти числа могут быть в нормализованой форме и в ненормализованой. Я не знаю когда именно делается нормализация. Более того, это может меняться от версии компилятора к версии. Стало быть вам надо будет перед
каждой ваше операцией по "лазанью в нутро" выполнять нормализацию.
Вобщем работа с числами с плавающей запятой не совсем тривиальная вещь.
Если же вы просто хотите преобразовать тип, то делайте кастинг - это инструкция компилятору преобразовать типы. Если хотите записать в float величину известную вам как целое двоичное число - опять же используйте кастинг.
Ответ отправил: Ilkras (статус: 6-ой класс)
Ответ отправлен: 14.04.2007, 10:15 Оценка за ответ: 3 Комментарий оценки: Для начинающего программиста кастинг - незнакомый термин, извините...
Вопрос № 82.264
Please, помогите мне решить задачки!!!!!!!!!!!
Приложение:
Отправлен: 12.04.2007, 18:44
Вопрос задал: Player (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Mihasic
Здравствуйте, Player!
Я полные программы писать не буду, напишу лишь частичные алгоритмы решения.
Касательно второго задания (про точки). Условие попадания в круг:
В приложение есть две программы, не факт что они совершенно подходят вам (например если вам надо рассматривать дробные координаты), но вы легко можете их подправить.
Приложение:
Ответ отправил: Пчелин Никита Игоревич (статус: 1-ый класс)
Ответ отправлен: 12.04.2007, 20:13
Отвечает: Терсков Сергей
Здравствуйте, Player!
Этот вопрос вы уже задавали 09.04.07 (http://rusfaq.ru/info/question/81742) и ответ на него я уже давал. Причем плюс к этим там была еще одна задача. На вский случай привожу код еще раз (для этих двух задач).
Приложение:
Ответ отправил: Терсков Сергей (статус: 7-ой класс)
Ответ отправлен: 13.04.2007, 02:39