Почему K&R не определяет длины типов данных лучше?
Каждый современный язык программирования, с которым я столкнулся, имеет четко определенные типы данных. Java, например, имеет int
это ровно 32 бита и long
это ровно 64 бита. Это не зависит от реализации, но встроено в саму спецификацию. С, с другой стороны, имеет short
это по крайней мере 16 бит, int
это по крайней мере 16 бит, и long
это как минимум 32 бита. Поскольку он определен как минимум, он может быть намного больше, что приводит к серьезным проблемам с переносимостью.
Я никогда этого не понимал. Я всегда считал это результатом различий в аппаратных стандартах 1970-х годов, но на самом деле это не имеет смысла для меня. Даже если бы было много компьютеров, которые не могли обрабатывать 64-битные типы данных, это не оправдывает отсутствие определения short
как обязательно 16 бит и int
как обязательно 32 бита. Из стандартов мы уже видим 32 бита как минимальное требование для любого оборудования.
Это распространение стандартов привело к появлению совета, подобного следующему, взятого из статьи Как сделать C (по состоянию на 2016 год):
Если вы обнаружите, что печатаете
char
или жеint
или жеshort
или жеlong
или жеunsigned
в новый код, вы делаете это неправильно.Для современных программ, вы должны
#include <stdint.h>
затем используйте стандартные типы.Для получения более подробной информации см.
stdint.h
Спецификация.Общие стандартные типы:
int8_t
,int16_t
,int32_t
,int64_t
- целые числа со знакомuint8_t
,uint16_t
,uint32_t
,uint64_t
- целые числа без знакаfloat
- стандартная 32-битная с плавающей точкойdouble
- стандартная 64-битная с плавающей точкойОбратите внимание, у нас нет
char
больше. char на самом деле неправильно назван и неправильно используется в C.Разработчики обычно ругают
char
означать "byte
Даже когда они делают без знакаbyte
Манипуляции. Гораздо чище использоватьuint8_t
означать единичное значение без знака-байта / октета иuint8_t *
означать последовательность значений беззнаковых байтов / октетов.
Я также заметил немало советов, рекомендующих использовать size_t
в качестве стандарта перейдите к int
замена, как в Modern C Дженсом Гастедтом, который использует size_t
в качестве управляющей переменной в for
Цикл в самом первом примере книги.