|
Кто разъяснит прикол IAR C |
|
|
|
 |
Ответов
|
Jul 12 2006, 17:41
|
Частый гость
 
Группа: Свой
Сообщений: 91
Регистрация: 26-01-06
Пользователь №: 13 668

|
Цитата #define FSHOWACT 40 // ×àñòîòà èñïîëíåíèÿ êîìàíä OCR1A = FCLK/(1024*FSHOWACT); // FCLK/1024/16.7 Ãö = 862 Не учел, что 40*1024 превышает максимальное значение для int (32767), и, соответственно, результат умножения получается отрицательным
|
|
|
|
|
Jul 12 2006, 17:53
|

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

|
Цитата(sz36 @ Jul 12 2006, 20:41)  Не учел, что 40*1024 превышает максимальное значение для int (32767), и, соответственно, результат умножения получается отрицательным Имеено так. Препроцессор по умолчанию считает все данные как int. Во избежание подобных недоразумений следует писать #define FCLK 14745600ULL, т.е объявлять константу типа unsigned long long или 14745600UL, т.е. unsigned long
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 13 2006, 07:03
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Сергей Борщ @ Jul 12 2006, 20:53)  Цитата(sz36 @ Jul 12 2006, 20:41)  Не учел, что 40*1024 превышает максимальное значение для int (32767), и, соответственно, результат умножения получается отрицательным
Имеено так. Препроцессор по умолчанию считает все данные как int. Во избежание подобных недоразумений следует писать #define FCLK 14745600ULL, т.е объявлять константу типа unsigned long long или 14745600UL, т.е. unsigned long Все правильно, только препроцессор здесь ни при чем. Препроцессор тупо заменяет один текст другим, а все остальное делает компилятор.
|
|
|
|
|
Jul 13 2006, 07:21
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(_Bill @ Jul 13 2006, 10:03)  Цитата(Сергей Борщ @ Jul 12 2006, 20:53)  Цитата(sz36 @ Jul 12 2006, 20:41)  Не учел, что 40*1024 превышает максимальное значение для int (32767), и, соответственно, результат умножения получается отрицательным
Имеено так. Препроцессор по умолчанию считает все данные как int. Во избежание подобных недоразумений следует писать #define FCLK 14745600ULL, т.е объявлять константу типа unsigned long long или 14745600UL, т.е. unsigned long Все правильно, только препроцессор здесь ни при чем. Препроцессор тупо заменяет один текст другим, а все остальное делает компилятор. Кто бы это ни делал, любые литералы, влезающие в диапазон целых , воспринимаются компилятором как целые если они не снабжены специальными суффиксами и не содержат десятичной точки. Надо сказать, что на разных платформах целые имеют разную длину. Поэтому для большей предсказуемости поведения компилятора надёжнее использовать типизированные константы. Ошибки могут быть выявлены ещё на этапе компиляции.
|
|
|
|
Сообщений в этой теме
SasaVitebsk Кто разъяснит прикол IAR C Jul 12 2006, 16:48 Romario Цитата(sz36 @ Jul 12 2006, 21:41) Цитата#... Jul 12 2006, 17:51   Сергей Борщ Цитата(_Bill @ Jul 13 2006, 10:03) Цитата... Jul 13 2006, 07:42    SasaVitebsk Спасибо теперь понял. Jul 13 2006, 19:05 GetSmart Вроде бы профи, но не знаю чем отличается long от ... Jul 12 2006, 19:46 Сергей Борщ Цитата(GetSmart @ Jul 12 2006, 22:46) Вро... Jul 12 2006, 20:55 GetSmart Целое на 8 байт? Jul 12 2006, 21:07 IgorKossak Цитата(GetSmart @ Jul 13 2006, 00:07) Цел... Jul 13 2006, 06:48
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|