Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 25
Текст из файла (страница 25)
Нас интересует только то, каким образом это влияет направила С ч-. Более масштабные н интересные проблемы, связанные с программированием в средах, поддерживающих несколько языков или несколько наборов сил1волов, выходят за рамки этой книги, хотя и упоминаются в некоторых местах ((1 20.2, э 21.7, э ВЗ.З). Можно с достаточной степенью уверенности преггположить, что набор символов конкретной реализации включает в себя десятичные цифры, 26 букв апг,пшского алфавита и некоторые основные знаки пунктуации. Небезопасно полагать, что 8-битный набор символов содержит только 127 символов (некоторые наборы содержат 256 символов), что нет символов, кроме английских букв (в большинстве европейских языков нх больше), что символы алфавита непрерывны (в стандарте ВВСП1С между г и г'имеется разрыв) нли что будут реализованы все символы, используемые в синтаксисе С++ (в некоторых национальных кодировках отсутствуют символы (, ), ), ], ), ~ — см, э" В.З.!).
Там, где это только возможно, следует избегать предположений о форме представления объектов. Это общее правило применимо даже к символам. Каждая символьная константа имеет числовое значение. Например, значением 'Ь' в наборе символов АЗСП является 98. Приведем пример программы, которая будет выводить целое значение введенного символа: П1пс!иНе <1оеи еат> тгтасп 1) сЬагс, вГй. и'п»с; вЫ>сонг «' значением '" с«" является " «спг)с) «'~п'; Выражение (п1 )с) возвращает целое значение, соответствующее символу 'с'. Вследствие возможности преобразования сЬаг в целое возникает следующая проблема: как интерпретировать сЬаг — со знаком или без? 256 значений, представляемых восемью битами, можно интерпретировать как значения от О до 255, либо как значения от -128 до 127.
К сожалению, выбор зависит от конкретной реализации (6 В.1, ~ В.ЗА). В С+~- имеется два способа явного указания диапазона; в1йпедсйагозпачает диапазон от -128 до 127, а ипв(днес( сйаг — от О до 255. К счастью, разница касается только значений вне диапазона Π— 127, а в последнии попадают все наиболее употребительные символы. Значения вне разрешенного диапазона, хранимые в сйаг, могут привести к тонким проблемам переносимости. Обратитесь к разделу 6 В.З.4, если вам необходимо использовать более одного типа сЬаг, или если вы храните целые числа в переменных типа сЬаг. Лля хранения символов из больших наборов, таких как Пп1со<1е, пмеегся тпп шсЬаг б Это специальньш тип.
Размер шсЬаг 1зависит от реализации; оп достаточно велик для представления всего набора символов, поддерживаемого данной реа- 4.3. Символьные типы лизацпей (см. 9 21.7, ч В.З.З). Странное имя (щсйаг 1) досталось по наследству от С. В С щсйаг 1 реализован как 1у)телег'Я 4.9.7), а не как встроенный тип. Суффикс 1 использовался, чтобы указать на определение через 1уре<(еЕ Обратите внимание, что символьные типы являются интегральными Я 4.1.1), так что к ним можно применять арифмст»<легкие н логические операции Я 6.2), 4.3.1. Символьные литералы Символьным литералом (символьной константой) называется символ, заключенный в одиночные кавычки.
Например, 'а' плп 'О'. Типом символьного литерала является с7<аг. Такие символьные литералы в действительности являются символическими константами, обозначающим целые значения сил<волов из набора символов па компьютере, на котором будет выполняться программа, Например, если вы запускаетс программу на машине, ь<спользую<цей набор АЯСП, значением 'О' будет 48. Использование символьных литералов вместо де< ятпчных обозначений делае~ программы более переносимыми. Несколько символов имеют специальное назначение. Онн записываются с помощью символа обратной косой черты <.
Например, '1 и' является символом перевода строки, а '<,1' — горизонтальной табуляцией. Подробности см. в 9 В.З.2. Символьные л«тералы пз расширенного набора записываются в виде Е'аб', при этом количество символов между одиночными кавычками и цх значение зависят от реализации и соответствуют типу щс)<аг 1. Литералы из расширенного символьного набора имеют тип щсЬаг 1. 4.4. Целые типы Также как и сваг, каждый целый тип может быть представлен в одном пз трех видов: «просто» т1 з(упе<1 т1 и ипз(упе<1 т1. Кроме того, целые могут быть трех размеров: ялог1 <п1, «просто» <п1 и )опут1.
Вместо 1опут1можно писать просто 1опд. Аналогично, з1<ог1 является синонимом для з1<ог1 т1, ипз<упе<1 — для ипз(ул с<1 т1и з!ул с<1 — для з|уп е<1 1п1 Типы илз1дпеа< (без знака) идеально подходят для задач, в которых память интерпретируется как массив битов.
И< пользование илядпе<3 вместо т1 с целью заработать лишний бнт для представления положительных целых почти всегда оказывается неудачным решением. Игпользование же обьявлсния илз<упе<Едля гарантии того, что целое будет неотрицательным, почти никогда не сработав~ из-за правил неявного преобразования ~илов (6 В.6.1, 9 В.6.2.1). В отличие от «просто> сваг, «просто» 101 всегда знаковые. Тпп з1дле<1 <п1(целое со знаком) является более точным синонимом «просто 1п1. 4.4.1. Целые литералы Целые литералы бывают: десятичные, восьмеричные, шестнадцатеричные и символьные (ь' А 3). Наиболее часто используются десятичные литералы и выглядят онп так, как вы и ожидаете: 0 1234 97б 12345б78901234507890 Компилятор должсн выдавать предупреждающее сообщение о литералах, слишком длинных для внутреннего представления.
112 Глава 4. Типы и объявления Литерал, который начинается с нуля н символа «хя (Ох), являешься шестнадцатеричным числом. Литерал, который начинается с нуля, за которым следуют цифры, является восьмеричным числом. Например; десягггичные: 2 63 ЗЗ аосьлгерн«ннег 00 02 077 0123 гаестнадяатеричннс: Охб Ох2 Ох31 Ох53 Буквы а, Ь, с, с(; е н!", либо их эквиваленты в верхнем регистре, используются для обозначения 10, 11, 12, 13, 14 н!5 соответственно. Восьмеричная п шегтнадцатернчная формы наиболее полезны для записи пеночек битов, 1Лспользование этих форм для записи обычных чисел может привести к неприятным сюрпризам.
Например, па машшге, где гп1 реализован комплиментарным (дополнительным) 16-битным словом, ОхуЩозначает десятичное — 1. Если же под целое отводится больше бит, Охи'будет равно б5535. Для явной записи литералов без знака (ипз1дпес1), можно использова~ь суффикс (7 Лналогичгго, суффикс Е можно использовать для явной записи 1опд-лгитералов. Напрнмер, 3 является константой типа 1гг1, 3(7 — ипзгулег1 Ы! и 31.
— 1опд Ы!. Гели суффикс отсутствует, компилятор присваивает целому литералу подходящий тпп, основываясь на его значении и размере целых в данной реализации Я В 4). Неплохо ограничить использование неочевидных констант несколькимц хорошо откомментированными соне! Я 5.4) илп инициализаторами перечислений Я 4.8). 4.5. Типы с плавающей точкой Типы с плавающей точкой представляют числа с плаваюгцей точкой. 1<ак и целые, типы с плавающей точкой представлены тремя размерами Яоа! (одинарной точности), агоиЫе (двойной точности) и !опд г1оиЫе (расширенной точноспг). Точный смысл каждого типа зависит от реализации.
Выбор нужной точности в реальных задачах требует хорошего понимания природы машинных вычислений с плавающей точкой. Если у вас его нет, либо проконсультируйтесь с кем-нибудь, либо изучите проблему сами, либо используйте с(оиЫе и надей~есь на лучшее. 4.5.1. Литералы с плавающей точкой По умолчанию литералы с плавающей точкой являются константами тгипа агоиЫе. Как обычно, компилятор должен вывестн предупреждение, сели литерал слишком длинен для его правильного представления. Вот несколько примеров литералов с плавагощегтг точкои: 1 23 .
23 0.23 1. 1.0 1 2е10 ! 23е — 15 Обратите внимание, что в записи литералов с плавающей ~очкой не должно быль пробелов. Например, 65,43 е-21 не является литералом, и будет воспринято, скорее всего, как набор четырех различньгх лексических единиц (что вызовет синтаксическую ошибку): 65 43 е — 21 Гслп требуешься литеры типа 11ои1, можно явно определить его с помощью суффикса ! (гг.чи Г): 314159265!' 20!' 2997925с 2.9е-З! Если требуется литерал типа 1опд агоиЫе, можно явно определить его с помощью суффикса!(или А): 3.14159265! 2.01 2.9979251.
2.9е-Л 4.6 Размеры 4.6. Размеры Некоторые свойства фундаментальных типов С«», например, размер переменной типа !лй зависят от реализации Я В 2). Я все| да указываю на эти зависимости н часто рекомендую избегать их или по крайней мере предпринимать шаги для сведения к минимуму их воздействия. Почему следует обращать на это внимание? Люди, пишущие программы в нескольких системах илп пользую|циеся несколькими компиляторалш, просто вынуждены уделять этому огромное внимание, поскольку в противном случае им придется тратить время на поиск и исправление нетривиальных ошибок.
Люди, которые заявляют, что пх не волнует проблема переносимости, обычно работают в одной системе и думают примерно так: «С«» это то, что понимает мой компилятор на моем компьютере»ъ Я счи~аю эту точку зрения узкой и недальновидной. Если вы написали удачную программу, вполне возможно ее захотя~ использовать в другой среде и кому-то придется искать и устранять проблемы, связанные с нюансами реализации. Кроме того, час~о возникает потребность скомпн.пировать программу другнмп компиляторами в той же самой среде и даже последующие версии вашего любимого компилятора мокнут интерпретировать неко~орые вещи но-другому.
Намного проще понять и ограничить влияние вещей, зависящих от реализации, непосредственно во время написания программы, чем пытаться разобраться с возникающими проблемалш «потел~». Ограничить воздействие реализации относительно п)зосто. Гораздо сложнее устранить спеппфнку библиотечных средств, зависящих от спс.семы. Одним из способов решения этой проблемы является использование стандартных библиотек, когда это возможно. Целью существования более одного целого типа, нескольких беззнаковых типов и нескольких вариантов чисел с плавающей точкой является предоставление программисту возможности эффективно использовать аппаратные средства.