I>По поводу размеров фундаментальных типов гарантируется следующее:
I>1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
Нашлось в 3.9.1/2 I>
I>Кроме того гарантируется, что для представления char используется по меньшей мере 8 бит, для представления short – по меньшей мере 16 бит и для long – по меньшей мере 32 бита
Это тонкий вопрос — в 5.3.3 говорится, что sizeof(char), sizeof(signed char), sizeof(unsigned char) равно 1. Остальные фундаментальные типы — implementation-defined. Особенно радует, что "sizeof(bool) is not required to be 1"
Что такое байт в терминах С++ см. 1.7 (а вообще по жизни — http://rsdn.ru/Forum/Message.aspx?mid=919062&only=1
Итак, что делать?
Посмотри в сторону numeric_limits<>::digits (и numeric_limits<>::is_specialized) (18.2.1.1)
Возвращает кол-во незнаковых бит в представлении.
Что еще может пригодиться? 3.9.1/3 (sizeof signed и unsigned одинаков). В качестве экзотики (портируемого даже на C решения), можно использовать макросы определенные в climits (удобная табличка для поиска макросов-аналогов методов numeric_limits, есть в Josuttis "The C++ Standard Library" )
Похоже, все. Удачи!
Здравствуйте, Аноним, Вы писали:
E>>А вот это темный вопрос. ISO/IEC 14882:2003 уже содержит в 1.2/1 ссылку на ISO/IEC 9899:1999. Правда Standard C Library по-прежнему определяется (в 1.2/2) как то, что описано в clause 7 ISO/IEC 9899:1990. С другой стороны, Numerical limits хоть и содержатся в библиотечном <limits.h>, но описаны вовсе не в "библиотечном" clause 7...
А>А где в стандарте С++ (кроме 1.2/ххх) содержится ссылка на стандарт С (в отношении размеров типов) и означает ли ссылка на стандарт С в 1.2/ххх что требования стандарта С для типов также должны выполняться для С++ ?
Ну, если хотите, в стандарте C++ явно сказано в 18.2.2, что в заголовке <climits> должны быть определены соответствующие константы. Там же даны ссылки на ISO C subclause 7.1.5, 5.2.4.2.2, 5.2.4.2.1. Статус этих ссылок разъясняется в 17.3.1.4 следующим образом:
Paragraphs labelled ‘‘SEE ALSO:’’ contain cross-references to the relevant portions of this Standard and the ISO C standard, which is incorporated into this Standard by reference.
I>Кроме того гарантируется, что для представления char используется по меньшей мере 8 бит, для представления short – по меньшей мере 16 бит и для long – по меньшей мере 32 бита
I>Так все-таки гарантируется (выделенное) или нет?
Требования к количеству значащих битов задаются через диапазон значений, которые должны быть представимы соответствующим целочисленным типом. Информация о граничных значениях целочисленных типов содержится в стандарте C. В ISO/IEC 9899:1999, как и в ISO/IEC 9899:1990, ее можно найти в разделе 5.2.4.2.1. Там, в частности, гарантируется, что значение UCHAR_MAX должно быть не менее 255 (значение CHAR_BIT, соответственно, не менее 8), значение USHRT_MAX не менее 65535 и значение ULONG_MAX не менее 4294967295.
I>Я пишу переносимый класс, который осуществляет некоторые манипуляции с битами и зависит от размеров фундаментальных типов данной платформы. Однако мне нужно гарантировать, что у передаваемых на вход функций параметров (как раз!) char >= 8 бит, short >= 16 бит, long >= 32 бит. Могу ли я на это рассчитывать?
Да, можете. Но для реализации переносимых битовых операций следует иметь в виду два следующих соображения. Во-первых, для представления наборов битов следует использовать беззнаковые целочисленные типы, т.к. не все возможные битовые паттерны должны представлять валидные значения знаковых типов. Во-вторых, sizeof типа в байтах, строго говоря, не определяет количества значащих битов в целочисленном типе, т.к. не все биты во внутреннем представлении типа должны участвовать в представлении значения. Исключением являются в C++ символьные типы, а в C99 — только unsigned char.
Здравствуйте, Ignoramus, Вы писали:
I>Читаю у Страуструпа (Язык программирования С++, спец. Издание), раздел 4.6. Размеры, стр. 113:
По поводу размеров фундаментальных типов гарантируется следующее:
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
Кроме того гарантируется, что для представления char используется по меньшей мере 8 бит, для представления short – по меньшей мере 16 бит и для long – по меньшей мере 32 бита
I>Так все-таки гарантируется (выделенное) или нет?
Да, гарантируется.
Просто в силу гарантированных диапазонов.
Скажем, для int — это минимум 16 бит, поскольку требуется представить диапазон -32767..+32767, и так для всех типов.
C++2003 18.2.2/1 (отсылка в C90 limits.h)
C++2003 3.9.1/2 (сноска 39)
C90/C99 5.2.4.2.1/1: (см. все интересующие Вас типы)
— minimum value for an object of type int
INT_MIN -32767 // -(2^15 — 1)
— maximum value for an object of type int
INT_MAX +32767 // 2^15 — 1
— maximum value for an object of type unsigned int
UINT_MAX 65535 // 2^16 — 1
C++2003 3.9.1/3:
"each signed integer type has the same object representation as its corresponding unsigned integer type."
Кроме того гарантируется, что для представления char используется по меньшей мере 8 бит, для представления short – по меньшей мере 16 бит и для long – по меньшей мере 32 бита
Конечно, Бьярн солидный авторитет в этих вопросах, но я перерыл весь стандарт и там насчет столь конкретного минимального размера в битах ничего не сказано. Лишь для char сказано что он должен быть достаточно большим чтобы уместить все необходимые для самого языка символы.
Так все-таки гарантируется (выделенное) или нет?
Я пишу переносимый класс, который осуществляет некоторые манипуляции с битами и зависит от размеров фундаментальных типов данной платформы. Однако мне нужно гарантировать, что у передаваемых на вход функций параметров (как раз!) char >= 8 бит, short >= 16 бит, long >= 32 бит. Могу ли я на это рассчитывать?
А если не могу, какой можно придумать портабельный код, который бы по-прежнему корректно работал?
Например, если мне нужно передать на вход не менее чем 32-битное целое, как мне лучше всего поступить? Пока в голову приходит std::bitset или void* + bitCount, но это мрачновато, очень уж не хочется отказываться от такой простой и удобной вещи как передача параметра long .
I>Кроме того гарантируется, что для представления char используется по меньшей мере 8 бит, для представления short – по меньшей мере 16 бит и для long – по меньшей мере 32 бита
I>Конечно, Бьярн солидный авторитет в этих вопросах, но я перерыл весь стандарт и там насчет столь конкретного минимального размера в битах ничего не сказано. Лишь для char сказано что он должен быть достаточно большим чтобы уместить все необходимые для самого языка символы.
I>Так все-таки гарантируется (выделенное) или нет?
I>Я пишу переносимый класс, который осуществляет некоторые манипуляции с битами и зависит от размеров фундаментальных типов данной платформы. Однако мне нужно гарантировать, что у передаваемых на вход функций параметров (как раз!) char >= 8 бит, short >= 16 бит, long >= 32 бит. Могу ли я на это рассчитывать?
I>А если не могу, какой можно придумать портабельный код, который бы по-прежнему корректно работал?
I>Например, если мне нужно передать на вход не менее чем 32-битное целое, как мне лучше всего поступить? Пока в голову приходит std::bitset или void* + bitCount, но это мрачновато, очень уж не хочется отказываться от такой простой и удобной вещи как передача параметра long .
Может подойдут enum'ы? Для
enum e {a = 255};
размер целого которым он представлен >= 8 бит.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Здравствуйте, crable, Вы писали:
C>Может подойдут enum'ы? Для
enum e {a = 255};
размер целого которым он представлен >= 8 бит.
Чего-то я не понял. Ты предлагаешь создать 2^32 значений enum'ов? Или сделать одно большое значение 2^32-1, таким образом как бы зарезервировать размер параметра ф-ции, и кастить потом инты в энумы? Как-то недостаточно изящно имхо.
Здравствуйте, Ignoramus, Вы писали:
I>Здравствуйте, crable, Вы писали:
C>>Может подойдут enum'ы? Для
enum e {a = 255};
размер целого которым он представлен >= 8 бит.
I>Чего-то я не понял. Ты предлагаешь создать 2^32 значений enum'ов? Или сделать одно большое значение 2^32-1, таким образом как бы зарезервировать размер параметра ф-ции, и кастить потом инты в энумы? Как-то недостаточно изящно имхо.
2^32 значений создавать не нужно, достаточно одного значения >= 2^32-1.
Будет ли это изящней чем bitset или нет уже сам решай... Я, честно говоря, тоже думаю, что это решение далеко от идеала, но, другого стандартного способа гарантировать минимальное число бит в целом числе я не знаю.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Здравствуйте, Ignoramus, Вы писали:
I>Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>>По видимому, минимальные требуемые размеры надо смотреть в стандарте С.
I>Смотрел но не нашел. Получается Бьярн говорит одно, а стандарт другое...
Наверно, имелся в виду не C++, а C99. Там есть fixed width integer types (int8_t, int32_t и т.п.), minimum-width integer types (int_least8_t и т.д.) и fastes minimum-width integer types (int_fast8_t и т.д.)
The last good thing written in C was Franz Schubert's Symphony No. 9.
Здравствуйте, crable, Вы писали:
C>Здравствуйте, Ignoramus, Вы писали:
I>>Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>>>По видимому, минимальные требуемые размеры надо смотреть в стандарте С.
I>>Смотрел но не нашел. Получается Бьярн говорит одно, а стандарт другое... C>Наверно, имелся в виду не C++, а C99. Там есть fixed width integer types (int8_t, int32_t и т.п.), minimum-width integer types (int_least8_t и т.д.) и fastes minimum-width integer types (int_fast8_t и т.д.)
Да, я его имел в виду. Можно посмотреть там 6.2.5
Of course, the code must be complete enough to compile and link.
Re: Гарантии sizeof(char, short, int, long)
От:
Аноним
Дата:
24.10.05 07:17
Оценка:
I>Я пишу переносимый класс, который осуществляет некоторые манипуляции с битами и зависит от размеров фундаментальных типов данной платформы. Однако мне нужно гарантировать, что у передаваемых на вход функций параметров (как раз!) char >= 8 бит, short >= 16 бит, long >= 32 бит. Могу ли я на это рассчитывать?
Если ты пишешь переносимый класс, то вероятно знаешь на каких платформах он будет работать и каковы там размеры. Кроме того, можно использовать макросы типа CHAR_BIT, INT_MAX и т.п.
Здравствуйте, Аноним, Вы писали:
I>>Я пишу переносимый класс, который осуществляет некоторые манипуляции с битами и зависит от размеров фундаментальных типов данной платформы. Однако мне нужно гарантировать, что у передаваемых на вход функций параметров (как раз!) char >= 8 бит, short >= 16 бит, long >= 32 бит. Могу ли я на это рассчитывать?
А>Если ты пишешь переносимый класс, то вероятно знаешь на каких платформах он будет работать и каковы там размеры. Кроме того, можно использовать макросы типа CHAR_BIT, INT_MAX и т.п.
Я полагал, что переносимость как раз заключается в незнании, т.е независимостии от того, на каких платформах код будет работать.
Макросы использовать можно, но они лишь дают информацию о размерах, но не гарантируют те или иные размеры типов.
Здравствуйте, Ignoramus, Вы писали:
I>Я пишу переносимый класс, который осуществляет некоторые манипуляции с битами и зависит от размеров фундаментальных типов данной платформы. Однако мне нужно гарантировать, что у передаваемых на вход функций параметров (как раз!) char >= 8 бит, short >= 16 бит, long >= 32 бит. Могу ли я на это рассчитывать?
I>А если не могу, какой можно придумать портабельный код, который бы по-прежнему корректно работал?
А почему не использовать boost(www.boost.org)?
Там определены типы int32_t, uint8_t т. д. Все переносимо, кросплатформенно и гарантировано
Здравствуйте, Ignoramus, Вы писали:
I>Читаю у Страуструпа (Язык программирования С++, спец. Издание), раздел 4.6. Размеры, стр. 113:
I>Кроме того гарантируется, что для представления char используется по меньшей мере 8 бит, для представления short – по меньшей мере 16 бит и для long – по меньшей мере 32 бита I>[/q]
A>Э, секундочку! Причём здесь Cи'99? Стандарт Си++'98 содержит нормативные ссылки на стандарт Си'90, а Cи'99 здесь не при делах.
Я думаю, что этот часть текста не сильно менялась при переходе от С89/90 к С99.
Впрочем, если охота, ищите старый вариант.
Of course, the code must be complete enough to compile and link.
Здравствуйте, achp, Вы писали:
C>>>Наверно, имелся в виду не C++, а C99. L_L>>Да, я его имел в виду.
A>Э, секундочку! Причём здесь Cи'99? Стандарт Си++'98 содержит нормативные ссылки на стандарт Си'90, а Cи'99 здесь не при делах.
А вот это темный вопрос. ISO/IEC 14882:2003 уже содержит в 1.2/1 ссылку на ISO/IEC 9899:1999. Правда Standard C Library по-прежнему определяется (в 1.2/2) как то, что описано в clause 7 ISO/IEC 9899:1990. С другой стороны, Numerical limits хоть и содержатся в библиотечном <limits.h>, но описаны вовсе не в "библиотечном" clause 7...
Re[7]: Гарантии sizeof(char, short, int, long)
От:
Аноним
Дата:
24.10.05 13:20
Оценка:
E>А вот это темный вопрос. ISO/IEC 14882:2003 уже содержит в 1.2/1 ссылку на ISO/IEC 9899:1999. Правда Standard C Library по-прежнему определяется (в 1.2/2) как то, что описано в clause 7 ISO/IEC 9899:1990. С другой стороны, Numerical limits хоть и содержатся в библиотечном <limits.h>, но описаны вовсе не в "библиотечном" clause 7...
А где в стандарте С++ (кроме 1.2/ххх) содержится ссылка на стандарт С (в отношении размеров типов) и означает ли ссылка на стандарт С в 1.2/ххх что требования стандарта С для типов также должны выполняться для С++ ?