реклама на сайте
подробности

 
 
> IAR C умножение int x int = long, Странность компилятора, или я что-то не допонимаю
Д_М
сообщение Jun 22 2013, 21:01
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185



Здравствуйте!
Перенёс код алгоритма, отлизанный при помощи C Builder, на IAR - не работает. После долгих поисков выявил, что когда умножаются два числа int, а частное long, старшие 16 бит частного всегда равны нулю. Когда сделал множителе тоже long всё нормально. Как-то странно. Другие компиляторы наоборот выдают придупреждения, когда разрядность частного не больше, чем разрядность множителей - char/int, или int/long...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mmor
сообщение Dec 9 2013, 13:14
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 22-04-06
Пользователь №: 16 379



Раз уж про умножение задам сюда же вопрос.
микроконтроллер AT90USB128. Среда программирования JAR 4.10. Язык С++.
есть необходимость помножить целое чесло на число с точкой. Задаю тип переменной double - компилятор комплирует программу, и даже результат умножения близок к истинному. Вот только сомнения меня гложут можно ли такую программу в контроллер зашивать? будет ли работать.
Поэтому все переменные оставил int, но умножаю на число с точкой.
Например:B = A*0.8;
Пусть A = 25000
Тогда B получается 20000.
Т. е. вычисляется вполне точно.
Стал смотреть дизасемблер, а там какой то сложный итеративный процесс идет.
Может кто нибудь на словах объяснить что контроллер делает при умножении на число с точкой?

Ну и еще вопрос по умножению целого на целое.
скажем 0A0Bh x 000Ch = 7884h.
При этом дизасемблер показывает, что умножение происходит по такому алгоритму:

(00x0B)+(0Cx0A) - это младший байт
(0Сx0B) - старший байт результата умножения.

Может кто объяснить откуда такой алгоритм взялся?

Сообщение отредактировал mmor - Dec 9 2013, 13:20
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 10 2013, 07:24
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(mmor @ Dec 9 2013, 15:14) *
Ну и еще вопрос по умножению целого на целое.
скажем 0A0Bh x 000Ch = 7884h.
При этом дизасемблер показывает, что умножение происходит по такому алгоритму:

(00x0B)+(0Cx0A) - это младший байт
(0Сx0B) - старший байт результата умножения.

Может кто объяснить откуда такой алгоритм взялся?
Вы попутали младший и старший байты результата.
пусть a=0x0A, b=0x0B, c=0x00, d=0x0C
тогда 0x0A0B = (a * 256 + b ), 0x000C = (c * 256 + d)
0x0A0B * 0x000C = (a * 256+b ) * (c * 256 + d) =
a * 256 * c * 256 + b * c * 256 + a * 256 * d + b * d =
(a * c) * 256^2 + (b * c + a * d) * 256 + b * d
-----------------
(a*c)*256^2 вылезло за разрядную сетку int, его нужно отбрасывать и можнго не считать
(b*c+a*d)*256 - дают старший байт (b*c+a*d), или 0x0B*0x00 + 0x0A*0x0C
b*d - младший байт, или 0x0B * 0x0C

Никакого мошенничества.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 21:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.0137 секунд с 7
ELECTRONIX ©2004-2016