Re: Гарантии sizeof(char, short, int, long)
От: FreshMeat Россия http://www.rsdn.org
Дата: 24.10.05 08:54
Оценка: 4 (2)
Здравствуйте, Ignoramus, Вы писали:

I>

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&amp;only=1
Автор: Зверёк Харьковский
Дата: 26.11.04
)

Итак, что делать?
Посмотри в сторону 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" )
Похоже, все. Удачи!
Хорошо там, где мы есть! :)
Re: Гарантии sizeof(char, short, int, long)
От: Lorenzo_LAMAS  
Дата: 24.10.05 06:53
Оценка: 1 (1) +1
По видимому, минимальные требуемые размеры надо смотреть в стандарте С.
Of course, the code must be complete enough to compile and link.
Re[8]: Гарантии sizeof(char, short, int, long)
От: elcste  
Дата: 24.10.05 14:35
Оценка: 12 (1)
Здравствуйте, Аноним, Вы писали:

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.

Re: Гарантии sizeof(char, short, int, long)
От: elcste  
Дата: 24.10.05 12:57
Оценка: 3 (1)
Здравствуйте, Ignoramus, Вы писали:

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.
Re: Гарантии sizeof(char, short, int, long)
От: ruslan_abdikeev Россия http://aruslan.nm.ru
Дата: 24.10.05 21:57
Оценка: 3 (1)
Здравствуйте, 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."

Ссылки на стандарты — http://www.livejournal.com/users/aruslan/44635.html
Гарантии sizeof(char, short, int, long)
От: Ignoramus  
Дата: 24.10.05 06:03
Оценка:
Читаю у Страуструпа (Язык программирования С++, спец. Издание), раздел 4.6. Размеры, стр. 113:

По поводу размеров фундаментальных типов гарантируется следующее:

1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
… [skipped]

Кроме того гарантируется, что для представления char используется по меньшей мере 8 бит, для представления short – по меньшей мере 16 бит и для long – по меньшей мере 32 бита


Конечно, Бьярн солидный авторитет в этих вопросах, но я перерыл весь стандарт и там насчет столь конкретного минимального размера в битах ничего не сказано. Лишь для char сказано что он должен быть достаточно большим чтобы уместить все необходимые для самого языка символы.

Так все-таки гарантируется (выделенное) или нет?

Я пишу переносимый класс, который осуществляет некоторые манипуляции с битами и зависит от размеров фундаментальных типов данной платформы. Однако мне нужно гарантировать, что у передаваемых на вход функций параметров (как раз!) char >= 8 бит, short >= 16 бит, long >= 32 бит. Могу ли я на это рассчитывать?

А если не могу, какой можно придумать портабельный код, который бы по-прежнему корректно работал?

Например, если мне нужно передать на вход не менее чем 32-битное целое, как мне лучше всего поступить? Пока в голову приходит std::bitset или void* + bitCount, но это мрачновато, очень уж не хочется отказываться от такой простой и удобной вещи как передача параметра long .
Re: Гарантии sizeof(char, short, int, long)
От: crable США  
Дата: 24.10.05 06:25
Оценка:
Здравствуйте, Ignoramus, Вы писали:

I>Читаю у Страуструпа (Язык программирования С++, спец. Издание), раздел 4.6. Размеры, стр. 113:


I>

I>По поводу размеров фундаментальных типов гарантируется следующее:

I>1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
I>… [skipped]

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.
Re[2]: Гарантии sizeof(char, short, int, long)
От: Ignoramus  
Дата: 24.10.05 06:53
Оценка:
Здравствуйте, crable, Вы писали:

C>Может подойдут enum'ы? Для
enum e {a = 255};
размер целого которым он представлен >= 8 бит.


Чего-то я не понял. Ты предлагаешь создать 2^32 значений enum'ов? Или сделать одно большое значение 2^32-1, таким образом как бы зарезервировать размер параметра ф-ции, и кастить потом инты в энумы? Как-то недостаточно изящно имхо.
Re[2]: Гарантии sizeof(char, short, int, long)
От: Ignoramus  
Дата: 24.10.05 06:54
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>По видимому, минимальные требуемые размеры надо смотреть в стандарте С.


Смотрел но не нашел. Получается Бьярн говорит одно, а стандарт другое...
Re[3]: Гарантии sizeof(char, short, int, long)
От: crable США  
Дата: 24.10.05 06:58
Оценка:
Здравствуйте, 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.
Re[3]: Гарантии sizeof(char, short, int, long)
От: crable США  
Дата: 24.10.05 07:06
Оценка:
Здравствуйте, 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.
Re[4]: Гарантии sizeof(char, short, int, long)
От: Lorenzo_LAMAS  
Дата: 24.10.05 07:09
Оценка:
Здравствуйте, 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 и т.п.
Re[2]: Гарантии sizeof(char, short, int, long)
От: Ignoramus  
Дата: 24.10.05 07:28
Оценка:
Здравствуйте, Аноним, Вы писали:

I>>Я пишу переносимый класс, который осуществляет некоторые манипуляции с битами и зависит от размеров фундаментальных типов данной платформы. Однако мне нужно гарантировать, что у передаваемых на вход функций параметров (как раз!) char >= 8 бит, short >= 16 бит, long >= 32 бит. Могу ли я на это рассчитывать?


А>Если ты пишешь переносимый класс, то вероятно знаешь на каких платформах он будет работать и каковы там размеры. Кроме того, можно использовать макросы типа CHAR_BIT, INT_MAX и т.п.


Я полагал, что переносимость как раз заключается в незнании, т.е независимостии от того, на каких платформах код будет работать.

Макросы использовать можно, но они лишь дают информацию о размерах, но не гарантируют те или иные размеры типов.
Re[5]: Гарантии sizeof(char, short, int, long)
От: Ignoramus  
Дата: 24.10.05 07:31
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Да, я его имел в виду. Можно посмотреть там 6.2.5


Киньте пожалуйста ссылкой где его (С99) можно взять!
Re: Гарантии sizeof(char, short, int, long)
От: pf79 Украина  
Дата: 24.10.05 07:35
Оценка:
Здравствуйте, Ignoramus, Вы писали:

I>Я пишу переносимый класс, который осуществляет некоторые манипуляции с битами и зависит от размеров фундаментальных типов данной платформы. Однако мне нужно гарантировать, что у передаваемых на вход функций параметров (как раз!) char >= 8 бит, short >= 16 бит, long >= 32 бит. Могу ли я на это рассчитывать?


I>А если не могу, какой можно придумать портабельный код, который бы по-прежнему корректно работал?


А почему не использовать boost(www.boost.org)?
Там определены типы int32_t, uint8_t т. д. Все переносимо, кросплатформенно и гарантировано
Re: Гарантии sizeof(char, short, int, long)
От: VoidEx  
Дата: 24.10.05 09:50
Оценка:
Здравствуйте, Ignoramus, Вы писали:

I>Читаю у Страуструпа (Язык программирования С++, спец. Издание), раздел 4.6. Размеры, стр. 113:


I>Кроме того гарантируется, что для представления char используется по меньшей мере 8 бит, для представления short – по меньшей мере 16 бит и для long – по меньшей мере 32 бита

I>[/q]

Так и есть. Сам в стандартах не рылся, но недавно была такая тема: http://www.gamedev.ru/forum/?group=9&amp;topic=4559&amp;page=3
пост номер 36.
Я думаю, нечто аналогичное есть и для long.
Re[5]: Гарантии sizeof(char, short, int, long)
От: achp  
Дата: 24.10.05 10:21
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

C>>Наверно, имелся в виду не C++, а C99.

L_L>Да, я его имел в виду.

Э, секундочку! Причём здесь Cи'99? Стандарт Си++'98 содержит нормативные ссылки на стандарт Си'90, а Cи'99 здесь не при делах.
Re[6]: Гарантии sizeof(char, short, int, long)
От: Lorenzo_LAMAS  
Дата: 24.10.05 10:48
Оценка:
A>Э, секундочку! Причём здесь Cи'99? Стандарт Си++'98 содержит нормативные ссылки на стандарт Си'90, а Cи'99 здесь не при делах.
Я думаю, что этот часть текста не сильно менялась при переходе от С89/90 к С99.
Впрочем, если охота, ищите старый вариант.
Of course, the code must be complete enough to compile and link.
Re[7]: Гарантии sizeof(char, short, int, long)
От: achp  
Дата: 24.10.05 11:50
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Я думаю, что этот часть текста не сильно менялась при переходе от С89/90 к С99.


Это верно (с точностью до формулировок и вновь введённых типов).
Re[6]: Гарантии sizeof(char, short, int, long)
От: elcste  
Дата: 24.10.05 13:05
Оценка:
Здравствуйте, 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/ххх что требования стандарта С для типов также должны выполняться для С++ ?
Re: Гарантии sizeof(char, short, int, long)
От: igna Россия  
Дата: 24.10.05 13:38
Оценка:

"Очевидно, что типы char и long double имеют разные размеры, однако это не гарантируется стандартом."


(Андрей Александреску, Современное проектирование на C++)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.