Сворачиванием констант
- Войдите на сайт для отправки комментариев
Втр, 20/11/2012 - 02:01
Добрый день.
Разрабатывал простенький проект для arduino ( использую их ide ). В коде было уравнение в котором было умножение больших константных чисел. Проблему заметил когда уравнение показало неверный результат. По идее данное умножение должно было происходить на стадии компиляции. Залез в исходники ide - avr-gcc вызывается с параметром -Os, сворачивание констант должно происходить. Что не так?
Что не так?
Не так что?
Где пример неправильного результата?
Где мне взять столько кофейной гущи, чтобы нагадать, что вы там наворотили в своем простеньком проекте?
Показали хотя бы, что за большие константы у вас и что за действия над ними выполняются.
А то:
"уважаемые ученые, у меня в подвале происходит стук. Объясните природу его образования"
умножение больших константных чисел
int a = 6000 * 1000
Читайте про типы данных. У Вас имеет место переполнение типа. Целочисленные типы - это не только int (который, кстати, позволяет хранить числа только диапазона +-32000). Константы тоже имеют тип. Например, 6000000L
2 admin: что-то в таблице символов не нашел "плюс-минус", раньше он там был :(
Я вам одно - вы мне другое
умножение больших константных чисел
int a = 6000 * 1000
Где другое?
Это присвоение НЕКОРРЕКТНО!
Нужно:
long a = 6000 * 1000
Вы понимаете суть самого топика?
Если Вам станет легче - я изменю пример:
Суть не меняет, при компиляции умножение не происходит.
Вы понимаете суть самого топика?
А вот стоит более подробно расписать - и даже вам станет понятна суть вашего топика:
Ы?
У меня все происходит:
Вот результат:
1) в правой части строки 5 все же нужен модификатор длинного целого (6000L либо 2000L, ну или оба сразу). иначе будет происходить перемножение по типу int.
2) а где в ассемблерном листинге собственно операция перемножения? неужто оптимизировалась?
(6000*2000=12000000 => 0x00B71B00, а, согласно приведенному листингу, в регистры, а из них в RAM загружается число 0x00001B00, т.е. 6912)
Да. Про модификаторы я и сам забыл. Но смысл был в том, что это умножение делается на стадии прекомпиляции и в листинг попадает только результат. При уножении компилятор поместил результат там где-то у себя в 2 байта (int) и старшая часть результата (00B7) просто обрезалась. Вопрос был изначально про "почему у меня компилятор не считает". А листингов, подтверждающих то, что он не считает, не было.
Вот я и привел доказательство, что подобные вычисления производятся ДО компиляции и в код не попадают (это не оптимизация даже). Так что
Если Вам станет легче - я изменю пример:
Суть не меняет, при компиляции умножение не происходит.
считаю голословным и неверным.
Вот я и привел доказательство, что подобные вычисления производятся ДО компиляции и в код не попадают (это не оптимизация даже).
Это и так было ясно
Тогда что не ясно?
AlexFisher, пардонствую за бестактный вопрос, как мне получить ассемблерный код
AlexFisher, пардонствую за бестактный вопрос, как мне получить ассемблерный код
1. Находите файлы hex и cof во временном каталоге системы (можно в IDE включить вывод подробностей при компиляции - он сам скажет, куда эти файлы положил)
2. Открываете cof с помощью AVR Studio, отвечаете на вопрос об используемом процессоре соответственно плате (у меня это atmega2560 - arduino MEGA)
3. Он еще спросит, где файл с исходником - указываете на Ваш файл с исходником)
4. Включаете окно дизасемблера. Можете шагать :) И вообще, можно делать отладку.
Обалдеть, а я дурак мучаюсь)))
Прерывания, порос портов тоже можно симулировать?