Цитата(&-rey @ Nov 21 2005, 14:30)

Захотелось чтобы препроцессор вычислял значение которое нужно запихнуть в UBRR...
решил сделать вот так:
Код
#define _BAUND 9600
#define Fosc 4000000
#define BAUND (Fosc/(_BAUND*16))-1
В результате получил 176 а не 25
тогда попробовал вот так:
Код
#define _BAUND 9600
#define BAUND ((Fosc/_BAUND)/16)-1
и получил желанные 25
Но ведь записи то одинаковые, а результаты разные... ???
Ты забыл явно указать тип. А в С, если тип не указан, по умолчанию считается что тип int.
в результате эта запись: (Fosc/(_BAUND*16))-1
эквивалентна такой: (Fosc/(int)(_BAUND*16))-1
т.е. при умножении _BAUND*16 получается число 163600, что больше 65535, а затем оно обрезается до int, с получением 22528.
Чтобы этого избежать надо записть так:
Код
#define _BAUD 9600
#define Fosc 4000000
#define BAUD ((Fosc/(_BAUD*16L))-1)
Т.е. после 16 добавить букву L - указание, что умножать следует на (long)16 с получением результата типа long.
Аналогичто следует поступать, если хочешь получить рузльтат вещественного типа:
Код
#define BAUD ((Fosc/(_BAUD*16.0))-1)
16.0 - число типа double и результат выражения будет типа double.
Если написать 16.0f - будет типа float.
Сообщение отредактировал starter48 - Nov 21 2005, 09:07