Справочная система C guide



         

Зависимость от ЭВМ - часть 2


Пример

#define SCREENWIDTH 80

Такое определение позволяет использовать поименованную константу SCREENWIDTH вместо числа 80. Определяйте размер объекта операцией sizeof Для определения размера некоторого объекта часто используют константы, что снижает мобильность программ. Использование операции sizeof позволяет решить эту проблему.

Пример

#define NUMELEM(ARRAY)

(sizeof(ARRAY) / sizeof(*(ARRAY))) Такое макроопределение обеспечивает мобильный способ определения числа элементов в массиве ARRAY.

Не используйте несколько символов в одной символьной константе.

Поскольку символьные константы представляются значениями типа int, определение языка Си позволяет в принципе задать символьную константу, состоящую из нескольких символов. Однако порядок размещения символов в машинном слове различен на разных ЭВМ.

Не полагайтесь на внутреннюю кодировку целых чисел.

Большинство ЭВМ представляет целые числа в дополнительном коде, но некоторые - в обратном коде. Поэтому не используйте возможности, которые предоставляет дополнительный код. Например, сдвиг на 1 бит влево отрицательного числа (чтобы уменьшить его значение в два раза) не приведет к желаемому результату на ЭВМ с обратным двоичным кодом. ' Формат чисел с плавающей точкой различен на разных ЭВМ.

Представление чисел с плавающей точкой на разных ЭВМ различно. Поэтому точность результатов арифметических вычислений с плавающей точкой может быть разной на различных ЭВМ. Избегайте или в крайнем случае подробно документируйте все вычисления, зависящие от точности.

Не полагайтесь на определенный порядок и число байт в слове.

Число байт и порядок их размещения а машинном слове различны у разных ЭВМ.

Пример

Следующая функция определена неправильно - на выход будет записан нулевой символ, если какой-то байт в слове имеет меньший адрес, чем младший байт;

#define STDOUT 1

putchar(c), /* неправильно */

mt с;

write(STDOUT, (char *) &c, 1);

В данном примере аргумент с должен описываться как имеющий тип char; в этом случае преобразование типа данных станет ненужным. .




Содержание  Назад  Вперед