Цитата(mdmitry @ Apr 30 2009, 19:05)

Часто необходимо приведение типа внутри кода (это CRC8):
Код
char wk_crc8_block(const char *datablock, const unsigned int count_byte)
{
register unsigned int count;
char crc1, ch;
crc1 = (char)CRC_WAKE_INIT;
for(count = 0; count < count_byte; count++)
{
ch = (char)datablock[count];
Do_Crc8(ch, &crc1);
}
crc1 = (char)crc1;
return(crc1);
}
void Do_Crc8(char b, char *crc)
{
int i;
for (i = 0; i < 8; i++)
{
if (((b ^ *crc) & 1) != 0)
*crc = (char)(((*crc ^ 0x18) >> 1) | 0x80);
else
*crc = (char)((*crc >> 1) & ~0x80);
b = (char)(b >> 1);
}
}
Без явного приведения типа к (char) для AVR -все в порядке, а на PC и freescale MC56F8346 полный бред.
Компилятор любит использовать размер данные "родной" для платформы (AVR - 8 бит, Freescale - 16, PC - 32).
Тут проблема может быть в другом, и явное приведение типа вовсе ни при чём. По стандарту не оговаривается чётко, должен быть беззнаковым тип char или иметь знак. Поэтому поведение такого кода может изменятся даже для одного и того же целевого процессора, в зависимости от ключей компиляции, а уж при переходе от одной платформы к другой - и подавно. Вот и получается, что для AVR char может быть беззнаковым - и всё в порядке, а на PC и Freescale char имеет знак - и получается полный бред. В таких случаях и надо использовать стандартный восьмибитный беззнаковый тип - uint8_t (который в большинстве случаев, но опять же не всегда - unsigned char).
ЗЫ. А stdint.h надо брать тот, который идёт с компилятором, а не из чужой среды, т. е. для борланда - борландский, для AVR - avrовский.