O-LED писал(а):кстати, а чем отличаются char и signed char? оба типа, это 8 битные переменные со значением от -128 до 127. чета в книжках этот вопрос не рассматривается, просто говорится что есть char и signed char, и все.....
вопрос этот рассматривается и весьма четко на нем заостряется внимание: тип char по стандарту Си - это знаковый тип, т.е. число со знаком. однако, так как нет отдельного типа для обычного байтового числа без знака, многие компиляторы отступают от стандарта и считают char беззнаковым. то есть
фактически наличие или отсутствие знака у char определяется реализацией конкретного компилятора. об этом всегда напоминают, в каждом компиляторе есть опция "переключения" char-а со знаковго на беззнаковый и наоборот... короче говоря, идет путаница.
однако, есть простой способ путаницы избежать, не взирая на компиляторы: надо всегда явно указывать наличие или отсутствие знака у переменных типа char:
signed char - для знаковых
unsigned char - для беззнаковых
просто
char не использовать вообще или использовать только для строковых переменных.
в этом случае можно гарантировать, что любой компилятор поймет программу правильно и однозначно. аналогичная неоднозначность имеется и с типом int и его производными - стандарт оговаривает только соотношение между
int и
long int (
long в 2 раза длиннее
int) или иные комбинации, но вот размер самого int определяется платформой: для AVR
int занимает 16 бит, для компьютера - 32 бита, есть и варианты в 64 бита... таким образом, путаница и проблемы могут быть и тут...
в частности, более продвинутые стандарты Си, например,
С99, уже вводит и рекомендует использовать вместо неоднозначных типов другие:
uint8_t - беззнаковое 8-битное число
int8_t - 8-битное со знаком число
uint16_t - 16-битное без знака
int16_t - 16-битное со знаком
и т.д.
использование этих типов совместно с компиляторами, поддерживающими
С99 гарантирует, что переменная будет иметь именно ту разрядность, что указано - никаких проблем с переносимостью!