Я довольно долго программировал на C и C++, а в ночное время я узнал об изменениях в размерах различных фундаментальных типов данных на платформах и системных архитектурах. Как и в C++, стандарт заявил, что размер int
должен быть как минимум 2 байта (или равен или больше short
... я точно не помню). Я знаю, что он будет меняться и может увеличиваться по мере продвижения вперед.
Единственное, что я не мог наблюдать, это изменение размеров классификаторов, таких как short
, long
(и, возможно, long long
). Они были одинаковыми в разных компиляторах и операционных системах, хотя типы данных росли в размерах и иногда были равны по размеру с их длинными версиями.
Просто из любопытства, есть ли какие-либо примеры в настоящем, где эти квалификаторы обладают большей пропускной способностью или просто фиксируются по размеру?
На самом деле они не "отборочные". Они наполовину описывают разные типы. short int
- это другой тип от int
. То же самое с long int
vs int
. Легко ввести в заблуждение тот факт, что (например) спецификатор простого типа " long
" разрешает тип long int
(C++ 11 Table 10) как форму синтаксического сахара. Но правила для размеров типов применяются к результирующим типам после этого разрешения; он никогда не определяется с точки зрения short
/long
ключевых слов.
И да, размеры этих типов были изменены, как и более знакомые типы; например, long int
составляет 4 байта в современной 64-битной Visual C++, но 8 байтов в современном 64-битном GCC.
long
, short
, unsigned
и т. Д. Не являются типами данных. Они могут быть привязаны к любому другому фундаментальному типу данных, верно? Кроме того, есть ли способ специально выделить размеры для фундаментального типа данных? Предположим, что int
составляет 6 байтов в системе. Есть ли способ создать int
произвольного размера от 2 до 6 байтов? Это будет проблемой?
long int
, short int
, unsigned int
(Таблица 10), и они, безусловно, являются типы данных. Вы можете считать long
по себе синтаксическим сахаром для long int
. Там нет "обвязки", как таковой. Как ключевые слова , да, они «привязаны», как описано в 7.1.6 / 2, чтобы сформировать полные типы. Все это означает, что вы хотите говорить о полных типах, а не об отдельных ключевых словах. Значение short
/ long
/ unsigned
не изменилось и никогда не изменится.
Есть, конечно, примеры: я знаю системы (не все современные), где int
- 16, 32, 36 и 48 бит; Я думаю, что были случаи, когда это было 24 бит или 60 бит (но это были бы действительно старые машины), и, возможно, некоторые другие значения. И я фактически работал на машине, где int*
был 16 бит, но char*
32 (но это было довольно давно).
Конечно, многие из этих машин вы вряд ли увидите сегодня, если вы не работаете с встроенными системами или мэйнфреймами. (Я думаю, что у многих встроенных процессоров по-прежнему имеется 16 бит int
.) С другой стороны, даже на обычных настольных компьютерах или ноутбуках long
может быть либо 32 бита (Windows и 32-битный Mac и Linux)), либо 64 бит (64 бит Mac или Linux).
int
и другие типы данных имеют большие размеры на некоторых платформах, long
, short
и другие также различаются, и это действительно то, о чем я хочу знать. Я знаю, что сам тип данных имеет разные размеры на разных архитектурах, но я хочу знать, меняются ли эти «классификаторы».
char
, 16 для short
и int
, 32 для long
и 64 для long long
. И ничего больше. (Также нет гарантии, что система будет использовать дополнение 2, и есть мэйнфреймы, которые этого не делают.)
long
было обычно 32 бита, а сейчас часто 64?int
перепрыгивали до 32 бит при переходе от старого компилятора Turbo C ++ к новому. Но я никогда не видел размерlong
изменения. Я использую Windows и использую разные компиляторы, но никогда не видел, чтобы long стал 64-битным (чтоlong long
уже).