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.