#define MASK (~07) /* правильно */ int х;
х &=- MASK,
Этот пример корректен для всех ЭВМ независимо от размера
данных типа int
Тщательно проверяйте операции сдвига.
Максимальное число бит, которые могут быть сдвинуты вправо или влево, различно на разных ЭВМ. Если заданный в операции сдвиг превысит допустимый максимум, то результаты операции будут непредсказуемы.
Перед сдвигом преобразуйте целые значения к типу unsigned. На некоторых ЭВМ сдвиг выполняется логически, т. е. освобождающиеся разряды обнуляются. На других сдвиг производится арифметически, и освобождающиеся разряды заполняются значением знакового разряда. Однако в языке Си гарантируется, что значения типа unsigned сдвигаются логически.
Используйте поименованные константы.
Использование в программе числовых констант, особенно когда смысл их неочевиден, является плохим стилем программирования. Числовые константы лучше определять в программе символическими именами, связанными с числовыми константами командой препроцессора #defme. Такие определения легко находить и модифицировать, если они размещены в некотором стандартном месте. Обычно это начало программы или файл заголовка.
Мобильность программ на языке Си 81
Пр имер
#define SCREENWIDTH 80
Такое определение позволяет использовать поименованную
константу SCREENWIDTH вместо числа 80.
Определяйте размер объекта операцией sizeof
Для определения размера некоторого объекта часто используют константы, что снижает мобильность программ. Использование операции sizeof позволяет решить эту проблему. Пример
#defme NUMELEM(ARRAY)\
(sizeof(ARRAY) / sizeof(*(ARRAY))) Такое макроопределение обеспечивает мобильный способ определения числа элементов в массиве ARRAY.
Не используйте несколько символов в одной символьной константе.
Поскольку символьные константы представляются значениями типа int, определение языка Си позволяет в принципе задать символьную константу, состоящую из нескольких символов. Однако порядок размещения символов в машинном слове различен на разных ЭВМ.