line_c |= 064; /* неверно устанавливает биты 2,4 и 5 */ .. Указание Misra C. Как это произошло?

line_c=0;
line_c |= 064; /* wrongly sets bits 2,4 and 5 */
line_c |= 64; /* rightly sets bit 6 */

Мишра С директива. Как это произошло? Пожалуйста, объясни.

3 ответа

line_c |= 064; /* wrongly sets bits 2,4 and 5 */

-> 064 (ведущий ноль) означает восьмеричное 64 (основание 8), которое 0011 0100 двоичный файл.

line_c |= 64; /* rightly sets bit 6 */

-> десятичное 64 (основание 10), преобразуется в 0100 0000 двоичный файл.

Целочисленный литерал с ведущими 0 восьмеричное число Так 064 не 64 (база 10). 064 является 52 в десятичном. Следовательно, он устанавливает разные биты для того, что 64 наборы.

В Си есть десятичные, восьмеричные и шестнадцатеричные литералы.

Шестнадцатеричные легко распознаваемы, потому что они начинаются с 0x, как 0xff для десятичного числа 255.

Восьмеричные - те, которые начинаются с цифры 0, возможно, сопровождаемые дальнейшими цифрами 0..7. Следовательно, буквальная константа 0 фактически синтаксически является восьмеричной константой. По этой причине правило 7.1 MISRA сформулировано следующим образом: "Восьмеричные константы (отличные от нуля) и восьмеричные escape-последовательности не должны использоваться". Поскольку 0 является восьмеричной константой, они явно должны разрешить ее использование:-)

Наконец, десятичные константы - это те, которые начинаются с цифры 1,9, а затем, возможно, далее цифры 0,9. Вот почему 064 отличается от 64.

Другие вопросы по тегам