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

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

Запись от Evg размещена 14.02.2012 в 21:30
Показов 52613 Комментарии 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
 
Новые блоги и статьи
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru