Evg |
СОДЕРЖАНИЕ
Базовые типы в Си/Си++
Запись от Evg размещена 14.02.2012 в 21:30
Показов 52583
Комментарии 1
|
ВНИМАНИЕ! Вопросы по существу обсуждаемого вопроса просьба задавать здесь или создать тему на форуме и кинуть на неё ссылку в блог или мне в личку.
Объясняю почему
Причин для этого несколько. Я, как и любой другой автор, всегда могу упустить интересный момент обсуждаемой темы (что подтвердилось на практике). А потому задаваемый вопрос может закрывать пробел в статье. Ответ на конкретный вопрос, как правило, дать несложно. Сложнее его аккуратно сформулировать так, чтобы ответ являлся законченной частью статьи. Поэтому, как правило, на первых порах я ограничиваюсь конкретным ответом на конкретный вопрос, а в статью временно вставляю ссылку на пост, где был дан ответ. А когда дойдут руки, то вместо ссылки пишу нормальное пояснение. Технические возможности блога не позволяют в комментариях пользоваться широкими возможностями, доступными на форуме (то как выделение текста жирным, вставка фрагментов исходников в удобном для чтения виде и т.п.), поэтому будет удобнее, если вопрос и ответ будут опубликованы на форуме Любая статья является изложением знаний в общем случае. У многих людей мышление устроено так, что прочтя на форуме конкретный вопрос и конкретный ответ на этот вопрос, у них появится бОльшее понимание, чем после прочтения теоретических выкладок (даже если они подкреплены конкретными примерами). Ссылки на такие обсуждения я, как правило, включаю в последний раздел статьи. Начинающие, как правило, поиск ответов на свои вопросы ведут именно в форуме, а не в блогах. А потому конкретный вопрос и конкретный ответ для них будет более удобным и полезным именно на форуме. Многие люди умеют работать методом тыка, лишь бы был конкретный пример в качестве образца. А потому такое обсуждение будет им полезным даже без прочтения статьи Исторически сложилось, что раньше (когда ещё не было блога) статьи располагались на форуме и представлены были в виде двух тем. Первая тема создавалась в специально отведённой свалке и представляла собой черновик, который со временем дорабатывался до законченной статьи. После этого статья переезжала во вторую тему в тематическом разделе. А первая тема оставалась дополнительной свалкой для замечаний и мелких вопросов по теме. Ссылку на старое местоположение данной свалки я помещаю в начале статьи. Вопросы, по возможности, прошу создавать в отдельных темах, но если вопрос действительно мелкий, то можно его задать и в указанной свалке. Статья по большому счёту представляет собой несколько разделов в форме "вопрос - ответ" 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", если они одинакового размера? Что касается размеров, то в языках Си/Си++, в отличие от многих языков программирования, размеры базовых типов не определены в стандарте. Для целочисленных типов Стандарт оговаривает только следующее:
Каждый компилятор вправе настраивать размеры типов по своему. Здесь мы видим, что у нас имеется 5 основных целочисленных типов, но при этом (на сегодняшний день) поддерживаются только 4 различных размера: 1 байт, 2 байта, 4 байта, 8 байт. Из-за этого и получится, что какие-то два типа будут описывать один и тот же размер. Следует оговорить, что тип "long long int" в "стандартном Си" (Си-89) отсутствует. В старых компиляторах этого типа нет, но все современные компиляторы его поддерживают. Дополнительно стандарт вводит ограничения снизу на значения, которые обязаны влезть в базовые типы - выдержка из стандарта. Другими словами, стандарт гарантирует минимальные размеры типов в битах 4. Типовые настройки целочисленных базовых типов в компиляторах на различных системах Как уже говорилось, каждый компилятор вправе настраивать размеры типов по своему, но современные промышленные компиляторы для универсальных процессоров, как правило, настраиваются схожим образом из соображений переносимости кода. Попробую свести в единую табличку все имена типов с их "типовыми" размерами, присущими на системах с различной разрядностью. В каждой строке пишу имена, которые обозначают один и тот же тип. Для полноты картины так же впишу в табличку диапазон значений, для которого можно использовать данный тип В табличке колонке "16-разрядные системы" соответствуют старые DOS'овские компиляторы, колонкам "32-" и "64-разрядные системы" - современные компиляторы на 32- и 64-битных операционных системах. При этом, как правило, на 64-битных системах поддерживаются 32-битные режимы компиляции и исполнения программ. Но 16-битные коды на современных системах не поддерживаются.
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
Комментарии


