c ++ 11 — c ++ целочисленный тип, автоматический 64 бит

я использую size_t для целого числа без знака в моем коде. Это имеет преимущество, если мой компьютер поддерживает 64 бит, size_t будет unsigned long long intв противном случае это unsigned int, Мой код может работать как на 32-битной, так и на 64-битной платформе.

Есть ли аналогичное целое число со знаком? Если платформа поддерживает только 32 бит, это int, если платформа поддерживает 64 бит, это long long int,

Я могу добиться этого, установив флаг:

#ifdef USE_INT64
#define MY_INT int
#else
#define MY_INT long long int
#endif

Тогда используйте MY_INT, Однако мне нужно определить USE_INT64 и включите этот заголовок для всего моего кода. Если есть что-то похожее на size_t, это будет замечательно.

1

Решение

Если вы хотите связать ваши типы напрямую с шириной адреса, то типы, которые вы ищете, называются uintptr_t а также intptr_t, Они наследуются от стандартной библиотеки C через <cstdint>,

Тип size_t не гарантируется, что он будет иметь тот же размер, что и указатель (в общем случае он меньше), что означает, что его применимость для этой цели зависит от платформы. (Читайте: даже если это будет работать везде, это концептуально неправильно.)

Конечно, реальный вопрос здесь заключается в том, есть ли веская причина связать ваш целочисленный тип с шириной адреса. Если нет, то лучшей идеей было бы определить ваши типы напрямую через uintNN_t/intNN_t набери и забудь про size_t и тому подобное.

4

Другие решения

Существует соответствующий подписанный тип ptrdiff_t это определено для определения разницы между двумя указателями. Он должен быть того же размера, что и указатель, так же, как size_t является.

1

Вы могли бы использовать std::make_signed чтобы получить точный подписанный аналог чего std::size_t для неподписанных:

using fancy_signed = std::make_signed<std::size_t>::type;
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector