Получение максимума целого числа без знака с битовым значением, отличным от нуля

Я пытаюсь получить максимальное значение определенного целого типа без знака без включения каких-либо заголовков, таких как <limits>, Поэтому я решил просто перевернуть биты целочисленного значения без знака 0.

#include <iostream>
#include <limits>

int main()
{
    std::cout << (~0U) << '\n'; // #1
    std::cout << (std::numeric_limits< unsigned >::max()) << '\n'; // #2
    return 0;
}

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

2 ответа

Решение

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

Просто назначьте значение -1

unsigned_type_of_choice max = -1;

Преобразование -1, который является intдля любого беззнакового типа приводит к значению числа, которое на единицу больше, чем наибольшее значение минус 1.

Следующее не предоставляет максимальное значение типа назначения. Сбой, когда диапазон типа назначения превышает диапазон unsigned, который является типом ~0U, @Christopher Oicles

// problem
unsigned_type_of_choice max_wannabe = ~0U;

Вы не должны назначать ~0U Ответ любого чакса уже объясняет почему.

Для C++ с помощью следующего вы можете получить максимально возможное значение для всех типов без знака.

template <typename T>
T max_for_unsigned_type() {
    return ~(static_cast<T> (0));
}

Вы отрицаете ноль вашего точного типа. Я использую подробное имя функции, потому что оно не должно использоваться для значений со знаком. Проблема в том, что для проверки подписи проще всего было бы добавить дополнительный заголовок, а именно type_traits. Тогда этот другой ответ был бы полезен.

Использование:

max_for_unsigned_type<uint8_t> ();
max_for_unsigned_type<uint16_t> ();
max_for_unsigned_type<uint32_t> ();
max_for_unsigned_type<uint64_t> ();
max_for_unsigned_type<unsigned> ();

Возвращенные значения: (см. Тестовый код здесь)

255
65535
4294967295
18446744073709551615
4294967295

Примечание. Делать это для типов со знаком гораздо сложнее, см. " Программирование определения максимального значения целого типа со знаком".

Другие вопросы по тегам