TL / DR - точный размер компилятора.
Стандарт требует, чтобы тип мог представлять минимальный диапазон значений - например, unsigned char
должен иметь возможность представлять как минимум диапазон [0..255]
, int
должен иметь возможность представлять как минимум диапазон [-32767...32767]
и т. д.
Этот минимальный диапазон определяет минимальное количество битов - вам необходимо не менее 16 бит для представления диапазона [-32767..32767]
(некоторые системы могут использовать биты заполнения или биты четности, которыечасть слова, но не используется для представления значения).
В игру вступают и другие архитектурные соображения - int
- это , обычно , равный размеру собственного слова.Таким образом, в 16-битной системе int
будет (обычно) 16 битами, а в 32-битной - 32 бита.Так что, в конечном итоге, дело доходит до компилятора.
Однако в 32-разрядной системе можно использовать один 16-разрядный int
, а другой - 32-разрядный int
.Это привело к потере времени в середине 90-х, когда я написал некоторый код, который предполагал 32-битный int
, который прекрасно работал под одним компилятором, но сломал мир под другим компилятором на том жеаппаратное обеспечение.
Итак, извлеченный урок - никогда не предполагает , что тип может представлять значения за пределами минимума , гарантированного Стандартом.Либо проверьте содержимое limits.h
и float.h
, чтобы определить, достаточно ли велик тип, либо используйте один из типоразмеров типа stdint.h
(int32_t
, uint8_t
и т. Д.).