|
|
|
Как добраться до бита переноса в С в CodeWarrior |
|
|
|
Jun 16 2009, 14:42
|
Участник
Группа: Участник
Сообщений: 63
Регистрация: 11-11-06
Из: Екатеринбург
Пользователь №: 22 191
|
Доброго всем времени суток!
Пишу программу под микроконтроллер HC908AP16 в среде Metrowerks CodeWarrior. Может, кто-н. сможет подсказать, как прочитать состояние бита переноса, не используя ассемблерную вставку? В Helpe на CodeWarrior есть указание на intrinsic function, но в какой библиотеке найти эту функцию?
Если ближе к делу, то задача в следующем. Из беззнаковой переменной типа long вычитаю другую беззнаковую типа char. Требуется ограничить результат снизу нулем. Я, конечно, могу посмотреть на старший бит результата, но, наверное, правильнее было бы смотреть на флаг переноса.
Сообщение отредактировал Василий Зыков - Jun 16 2009, 14:49
|
|
|
|
|
Jun 16 2009, 15:00
|
Гуру
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882
|
Ваша проблема совершенно надуманная. Пускай Код undigned long a, result; unsigned char b; тогда Код if (a>(unsigned long)b) result=a-b; else result=0; либо это же можно записать еще короче Код result=(a>(unsigned long)b)?(a-b):0; Пардон! Проглядел, что вторая переменная у вас другого типа. Поправил с помощью явного приведения типов. При вычислении разности применяется неявное приведение типов.
|
|
|
|
|
Jun 16 2009, 15:12
|
Участник
Группа: Участник
Сообщений: 63
Регистрация: 11-11-06
Из: Екатеринбург
Пользователь №: 22 191
|
Спасибо! Ну а все же... меня раздирает интерес, раз в help'е есть упоминание такой функции, значит, она должна быть Изначально у меня в программе эти числа были знаковыми. Но во время испытаний я понял, что для меня это лишнее - и на текущий момент я выкрутился аналогичным способом. Только, поскольку числа по-прежнему объявлены, как знаковые, я просто смотрю - если меньше нуля, ограничиваю нулем. Если их сделать беззнаковыми, то я бы пошел предложенным Вами путем. Если бы не увидел мельком в helpe упомянутую функцию. Или я, все же, зря ищу эту функцию?
|
|
|
|
|
Jun 16 2009, 16:50
|
Гуру
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095
|
Цитата(Василий Зыков @ Jun 16 2009, 18:40) В чем уродство intrinsic? Ни в чем. Это функция, код которой генерится компилятором. Наподобие функций +, -, *, /, %. Поэтому ответ на ваш первый вопрос - эта функция не в библиотеках. Причем, в отличие от библиотечной функции, компилятор может вставлять различные варианты реализации этой функции в зависимости от исходных условий и оптимизировать тело такой функции. Уродство не в intrinsic, а в доступе к флагу переноса. Ведь никто не может гарантировать, что между операцией вычитания и вызовом этой функции компилятор не встравит какие-либо инструкции, влияющие на этот флаг. Цитата(Василий Зыков @ Jun 16 2009, 18:40) Попробую сам догадаться... наверное, использование таких функций привязывает программу к конкретному компилятору? И это тоже.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|