c ++ кросс-платформенный способ определения 64-битного целого числа без знака - PullRequest
4 голосов
/ 14 февраля 2012

Сейчас я работаю над проектом, который широко использует 64-битные целые числа без знака во многих частях кода.До сих пор мы только компилировали с gcc 4.6, но теперь мы переносим некоторый код в windows.Крайне важно, чтобы эти неподписанные целые имели ширину 64 бита.Было высказано предположение, что мы можем использовать long long, но это не хорошо, если long long окажется больше 64 бит, мы на самом деле хотим иметь гарантию, что это будет 64 бита и что-то вроде static_assert(sizeof(long long) == 8) кажется немногозапах кода.

Каков наилучший способ определить что-то вроде uint64, которое будет компилироваться как в gcc, так и в msvc без необходимости использования везде разного синтаксиса кода?

Ответы [ 4 ]

14 голосов
/ 14 февраля 2012

Как насчет включения cstdint и использования std::uint64_t?

3 голосов
/ 14 февраля 2012

Вы можете использовать повышение:

typedef int # _t с заменой # на ширину обозначает подписанный целочисленный тип ровно # бит; например, int8_t обозначает 8-битный целочисленный тип со знаком. Точно так же typedef uint # _t обозначает целочисленный тип без знака ровно # бит.

См .: http://www.boost.org/doc/libs/1_48_0/libs/integer/doc/html/boost_integer/cstdint.html

Особенно этот заголовок: http://www.boost.org/doc/libs/1_48_0/boost/cstdint.hpp

1 голос
/ 21 июня 2012

Вот что я делаю:

#ifndef u64
#ifdef WIN32
typedef unsigned __int64   u64;
#else // !WIN32
typedef unsigned long long u64;
#endif
#endif
0 голосов
/ 15 февраля 2012

В Windows вы можете использовать __int64, unsigned __int64 или typedefs: UINT64, INT64 и т. Д.

Посмотрите на это

Но да, если переносимость кода вызывает беспокойство, используйте стандартные typedefs, как предлагали другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...