Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

9899 - Полный справочник по языку Си - Выпуск 3: Представление данных (часть 1)


Информационный Канал Subscribe.Ru

"9899"
Полный справочник по языку Си
Выпуск 3: Представление данных
(часть 1)
Программы на языке Си могут быть переносимыми, однако это вряд ли было бы так важно для нас, если б было так легко воплотимо на практике. Нам придется заплатить вниманием нескольких выпусков рассылки, чтобы разобраться с тем, какие гарантии у нас есть в отношении представления значений на разных платформах.
Объектные представления
Объектным представлением (object representation) значения называется множество байтов условно существующего объекта, имеющего это значение. За исключением битовых полей и объектов char-типов[1], количество байтов в таких объектах, а также их порядок и кодирование определяются конкретной реализацией.
Гарантировано, что любые значения с одинаковыми объектными представлениями заведомо равны, однако равные значения могут иметь разные объектные представления. Исключение составляют только нечисловые значения плавающих типов (floating-point NaNs), которые в сравнениях всегда различны, даже если их объектные представления совпадают.
Для объекта любого типа, за исключением unsigned char, допустимы такие представления, называемые trap-представлениями (trap representations), которые не представляют какого-либо допустимого значения такого объекта. Примером может быть представление с неверно установленным битом четности.
Значения char-типов
Объекты типов char, signed char и unsigned char всегда размещаются ровно в одном байте. Оправдывая имена своих типов, такие объекты наследуют у байта способность умещать значения любых символов из основного набора символов среды исполнения (basic execution character set), и в этом случае значения объектов заведомо положительные.
Кроме того, как и у байта, все разряды объектов типа unsigned char значащие, а их количество равно значению CHAR_BIT (этот макрос определяется в стандартном заголовке <limits.h>, и его значение равно, по меньшей мере, 8-ми). Поскольку объекты этого типа всегда представляются в простой двоичной форме (pure binary notation), они способны принимать любые целые значения в диапазоне от 0 до 2CHAR_BIT-1 включительно. На практике, если понадобилось точное значение верхней границы этого диапазона, удобнее использовать значение макроса UCHAR_MAX, определяемого в том же заголовке <limits.h>. В следующей таблице приведены предельные действительные и минимальные гарантированные значения char-типов.
Типы Предельные представимые значения
действительные минимальные
unsigned char 0 0
UCHAR_MAX 255
signed char SCHAR_MIN -127
SCHAR_MAX +127
char CHAR_MIN -
CHAR_MAX -
В отношении представления значений типа signed char справедливо то же, что и в отношении любых других знаковых целых (см. далее).
Обычно соответственно тому, операции над объектами какого типа ― signed char или unsigned char ― эффективнее, тип char реализуется знаковым или беззнаковым. В равных условиях традицией является знаковый char, и нередко изменить это можно опцией командной строки компилятора. В любом случае, тип char имеет диапазон представимых значений и представление в точности такие же, как один из этих типов ― signed char или unsigned char. Более того, если тип char принят знаковым, значения макросов CHAR_MIN и CHAR_MAX совпадают со значениями макросов SCHAR_MIN и SCHAR_MAX соответственно; в противном случае значение CHAR_MIN равно 0, а CHAR_MAX ― значению макроса UCHAR_MAX.
Значения short-, int-, long- и long long-типов
Представления беззнаковых типов этой группы (unsigned short, unsigned int, unsigned long и unsigned long long) образуются значащими битами (value bits) и padding-битами, причем наличие последних не обязательно, и является скорее исключением, чем правилом.
Как и в случае с типом unsigned char, значения перечисленных выше беззнаковых типов представляются в простой двоичной форме, однако значения padding-битов при этом не специфицированы.
В представлениях знаковых типов (signed char, signed short, signed int, signed long и signed long long) участвует, кроме значащих и, возможно, padding-битов, еще один ― знаковый.
Важно, что значение каждого из значащих битов в представлении любого значения любого из перечисленных типов равно значению того же бита в представлении значения соответствующего беззнакового типа. Другими словами, представления неотрицательных значений знаковых типов совпадают с представлениями тех же значений соответствующих беззнаковых типов. Так, если знаковый бит в представлении одного из этих типов сброшен, арифметическое значение представляемого числа неотрицательно, и определяется значащими битами в интерпретации простой двоичной формы; если же знаковый бит взведен, это значение модифицируется одним из трех способов:
    ― значение берется со знаком "минус" (представление "знак и модуль", "sign and magnitude");
    ― к значению прибавляется число -(2n) (представление "дополнение до двух", "two's complement");
    ― к значению прибавляется число -(2n-1) (представление "дополнение до единицы", "one's complement"),
где "n" ― количество значащих разрядов.
В первом и последнем случае возможны представления арифметического нуля с взведенным знаковым разрядом. Только от конкретной реализации зависит, являются ли такие представления trap-представлениями или представлениями т. н. отрицательного нуля (negative zero). В случае дополнения до двух представление с взведенным знаковым и сброшенными значащими разрядами также может быть trap-представлением.
Какой именно способ представления отрицательных чисел будет выбран, определяется реализацией. Кроме того, нет гарантий, что числа всех типов, даже в рамках одной реализации, будут представляться одним способом. Тем не менее, на практике трудно хоть сколько-нибудь значительно потерять в переносимости заложившись на представление знаковых типов в дополнении до двух, поскольку общая доля платформ с другими представлениями ничтожна.
Типы Предельные представимые значения
действительные минимальные
unsigned short 0 0
USHRT_MAX 65535
signed short SHRT_MIN -32767
SHRT_MAX +32767
unsigned int 0 0
UINT_MAX 65535
signed int INT_MIN -32767
INT_MAX +32767
unsigned long 0 0
ULONG_MAX 4294967295
signed long LONG_MIN -2147483647
LONG_MAX +2147483647
unsigned long long 0 0
ULLONG_MAX 264-1
signed long long LLONG_MIN -(263-1)
LLONG_MAX 263-1

[1] Здесь и далее под char-типами понимаются типы char, signed char и unsigned char.
    Рассылки Subscribe.Ru

ZipSites.ru ― интересные сайты одним архивом
На сайте предоставлены для скачивания "одним файлом" различные популярные сайты: Soobcha.ru, Cooking.ru, Copperfield.ru, Aferizm.ru, Countries.ru и многие другие. Проект экономит не только трафик и деньги, но и самое дорогое, что у нас есть ― ВРЕМЯ!
Подписаться одним кликом
     

    В следующем выпуске
Мы продолжим разговор о представлении данных, рассмотрим новые типы, появившиеся в [C99], а также расскажем о характиристиках значений плавающих типов.
С началом весны Вас и Ваших близких,
редакция рассылки "9899"
    Ссылки
Объектное представление (object representation): [C99 6.2.5, 6.2.6], [C++ 3.9]; значение (value): [C99 3.17, 5.2.4.2.1, 6.2.5, 6.2.6], [C99 Rationale 3, 6.5.3.4], [C++ 1.7]; нечисловые значения плавающих типов (floating-point NANs): [C99 5.2.4.2.2], [C99 Rationale 5.2.4.2.2]; trap-представление (trap representation): [C99 3.17.2, 3.17.3]; char-типы (character types): [C99 6.2.5], [C99 Rationale 0, 3]; основной набор символов среды исполнения (basic execution character set): [C99 5.1.1.2, 5.2.1, 6.2.5], [C99 Rationale 5.2.1], [C++ 2.1, 2.2]; заголовок ( header): [C99 7.10], [C++ 18.2.2]; простая двоичная форма (pure binary notation): [C99 6.2.6.1]; значащие разряды (value bits): [C99 6.2.6.2], [C99 Rationale 3]; padding-биты (padding bits): [C99 6.2.6.2, 5.2.4.2.2].
    Список литературы
[C99] ISO/IEC 9899:1999, Programming Languages ― C
[C99 Rationale] ISO/IEC Rationale for International Standard ― Programming Languages ― C, Revision 5.10
[C++] ISO/IEC 14882:1998, Programming Languages ― C++
© Иван Косарев, 2004. Все права защищены. Публикация и цитирование разрешены только с письменного согласия автора.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное