0xFF
наборы все биты в символе.
исходный реализатор, вероятно, решил, что стандарт 0
и 1
не был достаточно хорош и решил, что, если все биты прочь ложь затем, все биты на верны .
, Который работает, потому что в C любое значение кроме 0 истинно. Хотя это установит все байты в символе, он будет также работать на любой другой тип переменной, так как любой бит, устанавливаемый в переменной, делает его верным.
Также добавление 1 к 0xff устанавливает его на 0 (принятие неподписанного символа), и проверка, возможно, была в цикле с инкрементом для повреждения.
Вот вероятная причина: 0xff
двоичное дополнение 0
. Может случиться так, что на Вашей встроенной архитектуре, храня 0xff
в переменную более эффективно, чем хранение, скажем, 1
, который мог бы потребовать дополнительных инструкций или константы, сохраненной в памяти.
Или возможно самый эффективный способ проверить "значение истинности" регистра в Вашей архитектуре с "инструкцией по" набора контрольного бита. С 0xff
как Истинное значение, это не имеет значения , который бит проверяется..., они все установлены.
Вышеупомянутое является просто предположением, конечно, не зная, какой встроенный процессор Вы используете. 8-разрядный, 16-разрядный, 32-разрядный? PIC, AVR, ARM, x86???
(Поскольку другие указали, любое целочисленное значение кроме нуля считают TRUE в целях булевых выражений в C.)
Если Вы находитесь в отчаянной потребности памяти, Вы могли бы хотеть сохранить 8 булевских переменных в одном байте (или 32 в длинном, или безотносительно)
Это может легко быть сделано при помощи маски флага:
// FLAGMASK = ..1<<n for n in 0..7...
FLAGMASK = 0x10; // e.g. n=4
flags &= ~FLAGMASK; // clear bit
flags |= FLAGMASK; // set bit
flags ^= FLAGMASK; // flip bit
flags = (flags & ~FLAGMASK) | (booleanFunction() & FLAGMASK); // clear, then maybe set
это только работает, когда booleanFunction () возвращается 0 (все ясные биты) или-1 (весь набор битов).
Часто во встроенных системах существует один программист, который пишет весь код, и его особенности всюду по источнику. Многие встроенные программисты были инженерами HW и должны были получить систему, работающую как лучше всего, они могли. Не было никакого требования, ни понятия "мобильности". Другое соображение во встроенных системах является компилятором, специфично для HW ЦП. Обратитесь к ISA для этого ЦП и проверьте все использование "булевской переменной".
0xFF является шестнадцатеричным представлением ~0 (т.е. 11111111)
В, например, VB и Доступ,-1 используются в качестве Верных.
Как другие сказали, это устанавливает все биты на 1. И так как это встраивается C, Вы могли бы хранить это в регистр, где каждый бит важен для чего-то, таким образом, Вы хотите установить их всех на 1. Я знаю, что сделал подобный при записи в ассемблере.
То, что действительно важно для знания об этом вопросе, является типом "var". Вы говорите "булевскую переменную", но который является bool/C99's C++ или является им (очень вероятно, будучи встроенным приложением C), что-то вроде совершенно другого типа, это используется в качестве булевской переменной?