LINUX.ORG.RU

Целый фиксированный длинны в С++


0

0

Как в С++ объявить(определить) целый тип фиксированного размера? Имею ввиду то что на x86_64 long например в два раза длинее чем на x86_32, есть ли способ своять свой тип что бы он всегда был допустим 4 байта, и еще в пределах стандарта, что бы не привязываться к gcc и сторонним либам.

anonymous

либо использовать либы, где это уже реализовано, либо определять на этапе компиляции

anonymous
()

int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t.

Deleted
()

u?int(8|16|32|64)_t, но только соответствующий тип гарантирует лишь то, что число бит не меньше заданного (может быть и больше).

mo3r
()
Ответ на: комментарий от mo3r

>> но только соответствующий тип гарантирует лишь то, что число бит не меньше заданного (может быть и больше).

Согласно стандарту (C99) больше бит быть не может [u]intN_t - они чётко фиксированного размера. Больше по размеру могут быть типы [u]int_leastN_t и [u]int_fastN_t.

По поводу C++ - в текущем стандарте этих типов нет. Но поидее #include <stdint.h> должно работать практически всегда (если есть стандартная библиотека C, совместимая с ANSI C 99). В грядущем c++0x будет заголовочный файл cstdint.

Deleted
()
Ответ на: комментарий от mo3r

> u?int(8|16|32|64)_t, но только соответствующий тип гарантирует лишь то, что число бит не меньше заданного (может быть и больше).

это ты перепутал с u?int_least(8|16|32|64)_t

про u?int(8|16|32|64)_t не гарантируется вообще что они существуют.

Плюс вопрос был про С++. А эти типы из С99

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

> про u?int(8|16|32|64)_t не гарантируется вообще что они существуют.
> Плюс вопрос был про С++. А эти типы из С99

зато они существуют в POSIX совместимом окружении, чего в большинстве случаев более чем достаточно. если же стоит вопрос о переносимости кода между POSIX<->Win32/64, то о каком то там стандарте на C/C++ говорить не приходится и всё делается явным образом руками.

http://www.opengroup.org/onlinepubs/009695399/basedefs/stdint.h.html

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от Deleted

для венды можно сделать

#ifdef WIN32
typedef unsigned __int64_t uint64_t
.....
#endif

на остальных платформах включать stdint.h

Reset ★★★★★
()
Ответ на: комментарий от Reset

>> для венды можно сделать

В MinGW есть stdint.h. Так что s/#ifdef WIN32/#ifdef _MSC_VER/. Насчёт ICC и comeau не в курсе.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.