|
|
  |
Кто разъяснит прикол 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:51
|

Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 26-06-04
Пользователь №: 192

|
Цитата(sz36 @ Jul 12 2006, 21:41)  Цитата #define FSHOWACT 40 // ×àñòîòà èñïîëíåíèÿ êîìàíä OCR1A = FCLK/(1024*FSHOWACT); // FCLK/1024/16.7 Ãö = 862 Не учел, что 40*1024 превышает максимальное значение для int (32767), и, соответственно, результат умножения получается отрицательным угу, везде после констант желательно ставить два символа "ul" типа #define FSHOWACT 40ul ну и 1024 нужно написать как 1024ul
|
|
|
|
|
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, 06:48
|

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

|
Цитата(GetSmart @ Jul 13 2006, 00:07)  Целое на 8 байт? Именно. Если используете С++ (вдруг захочется), то константы удобнее делать типизированными: const unsigned long LONG_CONST = 4000000; и т. д. В этом случае компилятор будет предупреждать о потере значимости.
|
|
|
|
|
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 Все правильно, только препроцессор здесь ни при чем. Препроцессор тупо заменяет один текст другим, а все остальное делает компилятор. Кто бы это ни делал, любые литералы, влезающие в диапазон целых , воспринимаются компилятором как целые если они не снабжены специальными суффиксами и не содержат десятичной точки. Надо сказать, что на разных платформах целые имеют разную длину. Поэтому для большей предсказуемости поведения компилятора надёжнее использовать типизированные константы. Ошибки могут быть выявлены ещё на этапе компиляции.
|
|
|
|
|
Jul 13 2006, 07:42
|

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

|
Цитата(_Bill @ Jul 13 2006, 10:03)  Цитата(Сергей Борщ @ Jul 12 2006, 20:53)  Препроцессор по умолчанию считает все данные как int.
Все правильно, только препроцессор здесь ни при чем. Препроцессор тупо заменяет один текст другим, а все остальное делает компилятор. Да, правильно. А меня чего-то заклинило что это делает препроцессор. И очень меня это смущало. Спасибо, теперь "отпустило" :-) Действительно, при таком раскладе все становится гармоничным. Возможно я где-то более подробно читал какая из частей компилятора занимается вычислением констант и в голове ошибочно отложился препроцессор.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|