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

 
 
> 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
Ответов
Xenia
сообщение Jun 23 2013, 08:14
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Д_М @ Jun 23 2013, 01:01) *
После долгих поисков выявил, что когда умножаются два числа int, а частное long, старшие 16 бит частного всегда равны нулю. Когда сделал множителе тоже long всё нормально. Как-то странно. Другие компиляторы наоборот выдают придупреждения, когда разрядность частного не больше, чем разрядность множителей - char/int, или int/long...


1. При умножении чисел частное получиться не может. Частное есть результат деления (делимого на делитель), а результат умножения (сомножителей) называется произведением.

2. Компиляторы выдают предупреждение, когда результат усекается, когда результат "шире", чем та переменая, в которою его велено засунуть. А ваш случай противопоположный - int-результат спокойно помещается в long-переменную. С чего бы компилятору этим возмущаться? Ведь опасной для расчета потери части результата от этого произойти не может.

3. По законам языка C результат арифметической операции не превышает разрядности самого длинного операнда. Поэтому результат умножени int x int тоже будет получен в разрядной сетке int, даже, если она для него тесна. Иными словами, разрядность произведения зависит только от разрядности сомножителей, но никак не от разярдности переменной, у которою то произведение в последствии кладут. Поэтому для получения long-резултата необходимо хотя бы один из сомножителей привести к типу long, хотя бы явным образом: lres = (long)i1 * i2

4. Таких проблем нет, когда разрядность int равна разрядности long. Именно это случай имеет место при компиляции 32-разрядных приложений под x86.
Go to the top of the page
 
+Quote Post



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

 


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


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