Читаю у Страуструпа (Язык программирования С++, спец. Издание), раздел 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
.