Встроенный C: что делает var = 0xFF;?

Попробуйте sudo npm install -g eslint

19
задан Dan 13 October 2008 в 14:06
поделиться

8 ответов

0xFF наборы все биты в символе.

исходный реализатор, вероятно, решил, что стандарт 0 и 1 не был достаточно хорош и решил, что, если все биты прочь ложь затем, все биты на верны .

, Который работает, потому что в C любое значение кроме 0 истинно. Хотя это установит все байты в символе, он будет также работать на любой другой тип переменной, так как любой бит, устанавливаемый в переменной, делает его верным.

31
ответ дан 30 November 2019 в 01:59
поделиться

Также добавление 1 к 0xff устанавливает его на 0 (принятие неподписанного символа), и проверка, возможно, была в цикле с инкрементом для повреждения.

2
ответ дан 30 November 2019 в 01:59
поделиться

Вот вероятная причина: 0xff двоичное дополнение 0. Может случиться так, что на Вашей встроенной архитектуре, храня 0xff в переменную более эффективно, чем хранение, скажем, 1, который мог бы потребовать дополнительных инструкций или константы, сохраненной в памяти.

Или возможно самый эффективный способ проверить "значение истинности" регистра в Вашей архитектуре с "инструкцией по" набора контрольного бита. С 0xff как Истинное значение, это не имеет значения , который бит проверяется..., они все установлены.

Вышеупомянутое является просто предположением, конечно, не зная, какой встроенный процессор Вы используете. 8-разрядный, 16-разрядный, 32-разрядный? PIC, AVR, ARM, x86???

(Поскольку другие указали, любое целочисленное значение кроме нуля считают TRUE в целях булевых выражений в C.)

1
ответ дан 30 November 2019 в 01:59
поделиться

Если Вы находитесь в отчаянной потребности памяти, Вы могли бы хотеть сохранить 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 (весь набор битов).

12
ответ дан 30 November 2019 в 01:59
поделиться

Часто во встроенных системах существует один программист, который пишет весь код, и его особенности всюду по источнику. Многие встроенные программисты были инженерами HW и должны были получить систему, работающую как лучше всего, они могли. Не было никакого требования, ни понятия "мобильности". Другое соображение во встроенных системах является компилятором, специфично для HW ЦП. Обратитесь к ISA для этого ЦП и проверьте все использование "булевской переменной".

4
ответ дан 30 November 2019 в 01:59
поделиться

0xFF является шестнадцатеричным представлением ~0 (т.е. 11111111)

В, например, VB и Доступ,-1 используются в качестве Верных.

9
ответ дан 30 November 2019 в 01:59
поделиться

Как другие сказали, это устанавливает все биты на 1. И так как это встраивается C, Вы могли бы хранить это в регистр, где каждый бит важен для чего-то, таким образом, Вы хотите установить их всех на 1. Я знаю, что сделал подобный при записи в ассемблере.

3
ответ дан 30 November 2019 в 01:59
поделиться

То, что действительно важно для знания об этом вопросе, является типом "var". Вы говорите "булевскую переменную", но который является bool/C99's C++ или является им (очень вероятно, будучи встроенным приложением C), что-то вроде совершенно другого типа, это используется в качестве булевской переменной?

3
ответ дан 30 November 2019 в 01:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: