Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Внутреннее представление целочисленных типов в C++

#cpp #c #language_lawyer


В стандарте языка C довольно подробно расписываются представления целочисленных типов.
Например, биты объектного представления (object representation) знакового целочисленного
типа делятся на три группы: биты значений (value bits), биты заполнения (padding bits)
и знаковый бит (sign bit). Также некоторые комбинации битов объектного представления
могут генерировать trap representation.

Подробности представления целочисленных типов в стандарте языка C++ описаны  несколько
более скромно.

Вопрос состоит в следующем: внутреннее устройство целочисленных типов в языке C++
такое же как и в C? В каких пунктах стандарта C++ это описывается? (Описывается ли?)



Дополнение.

Немного конкретизирую вопрос. Требования стандарта языка C++ к внутреннему представлению
целочисленных типов такие же, как требования стандарта языка C, описанные в пункте
6.2.6.2 (здесь я ссылаюсь на документ n1570) или нет? Если нет, то в чём различия?

Если нет, то как быть в ситуациях, когда стандарт языка C++ явно ссылается на некоторые
пункты стандарта языка C?

Например, рассмотрим тип int_fast32_t. В пункте 21.4.1 (n4659), написано следующее:

    using int32_t = signed integer type ; // optional



  2 The header defines all types and macros the same as the C standard library header
stdint.h .
  See also: ISO C 7.20.


ОК. Смотрим пункт 7.20 в стандарте языка C. Небольшой фрагмент оттуда (7.20.1.3/2):


  The typedef name int_fastN_t designates the fastest signed integer type with a
width of at least N. [...]


Если посмотреть пункт 6.2.6.2 стандарта языка C, то станет понятно, что в объектном
представлении (object representation) типа int_fast32_t могут быть padding bits. Это
верно и для C++?
    


Ответы

Ответ 1



Стандарт языка С определяет ЯЗЫК, а не архитектуру, на которой этот язык реализован и, соответственно, внутреннее представление данных. К примеру, есть компиляторы для 16-битных процессоров, а есть - для 64-битных. Ясно, что внутренне представление данных целого типа будет совершенно разным. Я уж не говорю про порядок байт в памяти... Конкретно, в СТАНДАРТЕ ISO/IEC 9899:TC3 (5.2.4.2 Numerical limits) есть отсылка к заголовочному файлу (Приложение B.9), в котором описываются характеристики данной реализации языка: B.9 Sizes of integer types CHAR_BIT CHAR_MIN SCHAR_MIN SHRT_MIN INT_MIN LONG_MIN LLONG_MIN CHAR_MAX SCHAR_MAX SHRT_MAX UCHAR_MAX USHRT_MAX INT_MAX LONG_MAX INT_MAX ULONG_MAX LLONG_MAX ULLONG_MAX MB_LEN_MAX Сами разработчики языка С ("Язык программирования Си", Брайан В. Керниган, Деннис М. Ритчи) так описывают требования к типам данных: Если только не возникает противоречий со здравым смыслом, short int и long int должны быть разной длины, а int соответствовать естественному размеру целых на данной машине. Чаще всего для представления целого, описанного с квалификатором short, отводится 16 бит, с квалификатором long - 32 бита, а значению типа int - или 16, или 32 бита. Разработчики компилятора вправе сами выбирать подходящие размеры, сообразуясь с характеристиками своего компьютера и соблюдая следующие ограничения: значения типов short и int представляются по крайней мере 16 битами; типа long - по крайней мере 32 битами; размер short не больше размера int, который в свою очередь не больше размера long. Т.е. единственное требование к этим типам, заключается в том, что размер младшего должен быть не более размера старшего.

Ответ 2



Раздел 3.9.1/7 стандарта языка С++ говорит 3.9.1 Fundamental types 7 The representations of integral types shall define values by use of a pure binary numeration system.49 [ Example: this International Standard permits 2’s complement, 1’s complement and signed magnitude representations for integral types. —end example ] 49) A positional representation for integers that uses the binary digits 0 and 1, in which the values represented by successive bits are additive, begin with 1, and are multiplied by successive integral power of 2, except perhaps for the bit with the highest position. (Adapted from the American National Dictionary for Information Processing Systems.) Тот факт, что сразу за этим утверждением следует пример, упоминающий "2’s complement, 1’s complement and signed magnitude", т.е. именно знаковые представления, во видимому означает, что стандарт считает знаковые целочисленные представления входящими в "pure binary numeration system". Специальная роль для знакового бита действительно закреплена в сноске - "...except perhaps for the bit with the highest position". Но как там это выглядит в "American National Dictionary for Information Processing Systems" - не знаю.

Комментариев нет:

Отправить комментарий