Подтвердить что ты не робот

Embedded C: что такое var = 0xFF; делать?

Я работаю со встроенным C в первый раз. Хотя мой C ржавый, я могу прочитать код, но на самом деле я не понимаю, почему определенные строки являются такими, как есть. Например, я хочу знать, является ли переменная true или false и отправить ее обратно в другое приложение. Вместо того, чтобы установить переменную в 1 или 0, исходный разработчик выбрал 0xFF.

Он пытается установить его в адресное пространство? или зачем устанавливать логическую переменную 255?

4b9b3361

Ответ 1

0xFF устанавливает все биты в char.

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

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

Ответ 2

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

Ответ 3

0xFF - это шестнадцатеричное представление ~ 0 (т.е. 11111111)

В, например, VB и Access, -1 используется как True.

Ответ 4

Эти молодые парни, что они знают?

В одном из оригинальных встроенных языков - PL/M (-51 да, как и в 8051, -85, -86, -286, -386) - не было разницы между логическими операторами (!, & &, || в C) и побитовое (~, &, |, ^). Вместо этого PL/M имеет NOT, AND, OR и XOR, заботясь обо всех категориях. Мы лучше с двумя категориями? Я не совсем уверен. Однако я пропускаю логический оператор ^^ (xor) в C. Тем не менее, я думаю, можно было бы создавать программы на C без необходимости включать логическую категорию.

В PL/M False определяется как 0. Булевы обычно представлены в байтовых переменных. True определяется как NOT False, который даст вам 0ffh (PL/M-ese для C 0xff).

Чтобы увидеть, как происходит перенос флага статуса, прежде чем он хранится в байте (логическая не была доступна как тип), PL/M может использовать инструкцию сборки "sbb al, al" перед сохранением. Если перенос был установлен al, он содержал бы 0ff, если бы он не содержал бы 0h. Если требуется противоположное значение, PL/M вставляет "cmc" перед sbb или добавляет "not al" после (фактически xor - тот или другой).

Итак, 0xff для TRUE - это порт прямой совместимости с PL/M. Необходимо? Наверное, нет, если вы не уверены в своих навыках (в C) и играете в супер безопасном.

Как и я.

PL/M-80 (используется для 8080, 8085 и Z80) не поддерживали целые числа или поплавки, и я подозреваю, что это было одинаково для PL/M-51. PL/M-86 (для 8086, 8088, 80188 и 80186) добавлены целые числа, одинарная точность с плавающей запятой, сегмент: указатели смещения и стандартные модели памяти малые, средние, компактные и большие. Для тех, кто так склонен, существуют специальные директивы для создания моделей собственной гибридной памяти. Модель огромной памяти Microsoft была эквивалентна Intel. MS также имеет небольшие, маленькие, компактные, средние и крупные модели.

Ответ 5

Часто во встроенных системах есть один программист, который пишет весь код, и его/ее особенности связаны с источником. Многие встроенные программисты были инженерами HW и должны были работать как можно лучше. Не было требования и понятия "переносимости". Еще одно соображение во встроенных системах - это компилятор, характерный для CPU HW. Обратитесь к ISA для этого CPU и проверьте все виды использования "boolean".

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

Или, возможно, наиболее эффективным способом проверки "значения истинности" регистра в вашей архитектуре является команда "check bit set". Если значение 0xff равно TRUE, не имеет значения, какой бит проверяется... все они установлены.

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

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