Форум программистов, компьютерный форум, киберфорум
Evg
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Базовые типы в Си/Си++

Запись от Evg размещена 14.02.2012 в 21:30
Показов 52594 Комментарии 1
Метки c, c++, си

ВНИМАНИЕ! Вопросы по существу обсуждаемого вопроса просьба задавать здесь или создать тему на форуме и кинуть на неё ссылку в блог или мне в личку.
Объясняю почему

Причин для этого несколько.

Я, как и любой другой автор, всегда могу упустить интересный момент обсуждаемой темы (что подтвердилось на практике). А потому задаваемый вопрос может закрывать пробел в статье. Ответ на конкретный вопрос, как правило, дать несложно. Сложнее его аккуратно сформулировать так, чтобы ответ являлся законченной частью статьи. Поэтому, как правило, на первых порах я ограничиваюсь конкретным ответом на конкретный вопрос, а в статью временно вставляю ссылку на пост, где был дан ответ. А когда дойдут руки, то вместо ссылки пишу нормальное пояснение. Технические возможности блога не позволяют в комментариях пользоваться широкими возможностями, доступными на форуме (то как выделение текста жирным, вставка фрагментов исходников в удобном для чтения виде и т.п.), поэтому будет удобнее, если вопрос и ответ будут опубликованы на форуме

Любая статья является изложением знаний в общем случае. У многих людей мышление устроено так, что прочтя на форуме конкретный вопрос и конкретный ответ на этот вопрос, у них появится бОльшее понимание, чем после прочтения теоретических выкладок (даже если они подкреплены конкретными примерами). Ссылки на такие обсуждения я, как правило, включаю в последний раздел статьи.

Начинающие, как правило, поиск ответов на свои вопросы ведут именно в форуме, а не в блогах. А потому конкретный вопрос и конкретный ответ для них будет более удобным и полезным именно на форуме. Многие люди умеют работать методом тыка, лишь бы был конкретный пример в качестве образца. А потому такое обсуждение будет им полезным даже без прочтения статьи

Исторически сложилось, что раньше (когда ещё не было блога) статьи располагались на форуме и представлены были в виде двух тем. Первая тема создавалась в специально отведённой свалке и представляла собой черновик, который со временем дорабатывался до законченной статьи. После этого статья переезжала во вторую тему в тематическом разделе. А первая тема оставалась дополнительной свалкой для замечаний и мелких вопросов по теме. Ссылку на старое местоположение данной свалки я помещаю в начале статьи. Вопросы, по возможности, прошу создавать в отдельных темах, но если вопрос действительно мелкий, то можно его задать и в указанной свалке.





Статья по большому счёту представляет собой несколько разделов в форме "вопрос - ответ"

1. Типы "short" и "short int" это одно и то же, или нет?

Язык Си разрабатывался в те времена, когда памяти на машинах было мало. Язык разрабатывался программистами, которые, как правило, гораздо более небрежно относятся к формальностям, нежели математики (многие другие языки разрабатывали математики). Стандарт Си появился лишь постфактум - т.е. уже после того, как язык начал широко использоваться. А потому получилось так, что синтаксис языка излишне расхлябанный и фривольный (позже часть этой расхлябанности была унаследована в язык Си++). Одним из следствий является то, что один и тот же тип может быть записан по разному. Например "short" и "short int" - это две записи одного и того же типа. Более подробно обо всех обозначениях будет написано ниже (в разделе 4).

2. Что такое "char"?

Тем, кто начал программировать на Си после других языков программирования, поначалу сложно привыкать к типу char. В языке Си нету символьных типов, как в других языках, а потому char - это обычный целочисленный тип: такой же по природе, как int, но другого размера. Тип получил такое имя (char от слова "character" - символьный) для того, чтобы подчеркнуть, что из этого типа в языке строятся строки (в то время как настоящих строковых типов в языке Си так же нет), но по этому поводу надо будет написать отдельный раздел. В стандарте языка Си описываются типы signed char и unsigned char, а тип char описывается как зависящий от реализации, но он должен быть эквивалентен либо signed char'у, либо unsigned char'у. Большинство компиляторов (как старых, так и современных) настроено так, что char по умолчанию эквивалентен signed char'у и имеется опция, по которой char будет эквивалентен unsigned char'у. Однако с точки зрения языка Си++ тип char, несмотря на то, что он эквивалентен (по трактовке целого значения) либо signed char'у, либо unsigned char'у, является самостоятельным типом (что критично с точки зрения перегрузки функций). Других целочисленных типов это НЕ касается!

3. Зачем сделаны два типа "int" и "long", если они одинакового размера?

Что касается размеров, то в языках Си/Си++, в отличие от многих языков программирования, размеры базовых типов не определены в стандарте. Для целочисленных типов Стандарт оговаривает только следующее:
  • sizeof (char) равен 1 байту. Не забываем, что байты тоже бывают разные (см. Бит и байт)
  • sizeof (char) <= sizeof (short int) <= sizeof (int) <= sizeof (long int) <= sizeof (long long int)

Каждый компилятор вправе настраивать размеры типов по своему. Здесь мы видим, что у нас имеется 5 основных целочисленных типов, но при этом (на сегодняшний день) поддерживаются только 4 различных размера: 1 байт, 2 байта, 4 байта, 8 байт. Из-за этого и получится, что какие-то два типа будут описывать один и тот же размер. Следует оговорить, что тип "long long int" в "стандартном Си" (Си-89) отсутствует. В старых компиляторах этого типа нет, но все современные компиляторы его поддерживают.

Дополнительно стандарт вводит ограничения снизу на значения, которые обязаны влезть в базовые типы - выдержка из стандарта. Другими словами, стандарт гарантирует минимальные размеры типов в битах

4. Типовые настройки целочисленных базовых типов в компиляторах на различных системах

Как уже говорилось, каждый компилятор вправе настраивать размеры типов по своему, но современные промышленные компиляторы для универсальных процессоров, как правило, настраиваются схожим образом из соображений переносимости кода. Попробую свести в единую табличку все имена типов с их "типовыми" размерами, присущими на системах с различной разрядностью. В каждой строке пишу имена, которые обозначают один и тот же тип. Для полноты картины так же впишу в табличку диапазон значений, для которого можно использовать данный тип

В табличке колонке "16-разрядные системы" соответствуют старые DOS'овские компиляторы, колонкам "32-" и "64-разрядные системы" - современные компиляторы на 32- и 64-битных операционных системах. При этом, как правило, на 64-битных системах поддерживаются 32-битные режимы компиляции и исполнения программ. Но 16-битные коды на современных системах не поддерживаются.

Тип
16-разрядные системы
32-разрядные системы
64-разрядные системы
char
signed char
8-битное знаковое
от -128 до 127
unsigned char
8-битное беззнаковое
от 0 до 255
short
short int
signed short
signed short int
16-битное знаковое
от -32.768 до 32.767
unsigned short
unsigned short int
16-битное беззнаковое
от 0 до 65.535
int
signed int
16-битное знаковое
от -32.768 до 32.767
32-битное знаковое
от -2.147.483.648 до 2.147.483.647
unsigned
unsigned int
16-битное беззнаковое
от 0 до 65 535
32-битное беззнаковое
от 0 до 4.294.967.295
long
long int
signed long
signed long int
32-битное знаковое
от -2.147.483.648 до 2.147.483.647
64-битное знаковое
от -9.223.372.036.854.775.808
до 9.223.372.036.854.775.807
unsigned long
unsigned long int
32-битное беззнаковое
от 0 до 4.294.967.295
64-битное беззнаковое
от 0 до 18.446.744.073.709.551.615
long long
long long int
signed long long
signed long long int
отсутствует
64-битное знаковое
от -9.223.372.036.854.775.808
до 9.223.372.036.854.775.807
unsigned long long
unsigned long long int
отсутствует
64-битное беззнаковое
от 0 до 18.446.744.073.709.551.615

5. Типовые настройки базовых вещественных типов в компиляторах на различных системах

FIXME Написать, пока есть ссылка:

Вопрос о типах данных С++

FIXME long double настроен везде по разному, а где-то его вообще нет. Уточнить, что по этому поводу говорит Стандарт.

6. Выравнивание типов

FIXME Надо бы написать, но пока есть ссылка с пояснением

оператор sizeof

7. Правильное написание констант различных типов

FIXME Написать, а пока только ссылки
FIXME Что на самом деле представляют символьные (char'овские) константы 'a', 'b'

Cлучайные числа long double
unsigned long long и Builder 2010
Как поместить число 4294967296 в переменную?
U, L, F в константах

http://darkraha.com/rus/cpp/cpp05.php

8. Отличие между знаковыми и беззнаковыми типами

FIXME Надо бы написать, но пока есть ссылки с пояснениями

9. Ссылки на темы, где обсуждался данный вопрос

10. Внешние ссылки по данной тематике
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Если есть short int и long int, то логично было бы действительные назвать не float и double, а short float и long float, а просто short и long не поддерживать. Или уж поддерживать short и long, подразумевая под ними инты, но не поддерживать short int и long int.
    Запись от размещена 27.02.2014 в 13:47
 
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru