Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
int
, short
… не всё рассказал. Так и задумано. Целью поста было рассмотрение только скользких вопросов. Типы size_t
, ptrdiff_t
, intptr_t
, uintptr_t
самоописательны и довольно предсказуемы.sizeof(void*) == sizeof(long)
?sizeof(char)>sizeof(long)
Таким образом, вполне законны ситуации типа sizeof(char)>sizeof(long).
For any two integer types with the same signedness and different integer conversion rank
(see 6.3.1.1), the range of values of the type with smaller integer conversion rank is a
subrange of the values of the other type.
The rank of long long int shall be greater than the rank of long int, which
shall be greater than the rank of int, which shall be greater than the rank of short
int, which shall be greater than the rank of signed char.
C переносимый, поэтому в нём базовые целочисленные типы (char, short, int и др.) не имеют строго установленного размера, а зависят от платформы.
Портируемость (переносимость, англ. portability) обычно относится к одной из двух вещей:
1. Портируемость — как возможность единожды откомпилировав код (обычно в некоторый промежуточный код, который затем интерпретируется или компилируется во время исполнения, «на лету», англ. Just-In-Time), затем запускать его на множестве платформ без каких-либо изменений.
2. Портируемость — как свойство программного обеспечения, описывающее, насколько легко это ПО может быть портировано. По мере развития операционных систем, языков и техники программирования, становится всё проще портировать программы между различными платформами. Одной из изначальных целей создания языка Си и стандартной библиотеки этого языка — была возможность простого портирования программ между несовместимыми аппаратными платформами. Дополнительные преимущества в плане портируемости могут иметь программы, удовлетворяющие специальным стандартам и правилам написания (см., например: Smart Package Manager).
Про то, что на данный момент С является одним из самых непереносимых языков. Другие языки хорошо себя чувствуют на разных платформах.
There are five standard signed integer types: “signed char”, “short int”, “int”, “long int”, and “long
long int”. In this list, each type provides at least as much storage as those preceding it in the list.
unsigned char
и signed char
— это как бы байты и уж как минимум абстракции чисел, а char
— это вообще не число, а символ алфавита и может занимать хоть 4 байта?а char
— это вообще не число, а символ алфавита
char
является естественным типом для хранения базовых символов.char
должен вмещать любой из базовых символов, причём так, чтобы их числовое значение было неотрицательным. (Конкретный пример: базовый набор — ASCII, а char
— знаковый 8-битный целочисленный тип.)char
, заканчивающийся символом '\0'
, численное значение которого не обязано быть нулём. Стандарт определяет для строк синтаксический сахар через двойные кавычки. Но это я уже ушёл от темы.char
как просто о целочисленном типе, то стандарт требует, чтобы диапазон его значений совпадал либо с signed char
, либо с unsigned char
, на выбор компилятора. То есть фактически тип char
эквивалентен одному из этих типов, как я уже писал в статье.
Вся правда о целочисленных типах в C