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

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


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Д_М @ Jun 23 2013, 01:01) *
что когда умножаются два числа int, а частное long, старшие 16 бит частного всегда равны нулю.

при умножении получается произведение, причем здесь частное? (частное образуется при делении)

все верно при умножении двух int получается int, результат преобразуется в long!
Но только для i386 int 32 битный, а для AVR - 16 битный! Поэтому старшие 16 бит будут или 0 или 0xffff (если результат отрицательный)



Цитата(Д_М @ Jun 23 2013, 01:39) *
Если я правильно понимаю, то разрядность переменных определяется спецификацией языка C, а не аппаратной платформой, или компилятором. Везде и всегда int -16 бит, long - 32 бита.

Это не так и во всех книжках по С это написано.


Кстати для AMD64 вообще:
linux - long 64 бита, а windows - long 32 бита!
Так что где важна битность - используйте stdint.h
Go to the top of the page
 
+Quote Post



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

 


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


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