Получение максимума целого числа без знака с битовым значением, отличным от нуля
Я пытаюсь получить максимальное значение определенного целого типа без знака без включения каких-либо заголовков, таких как <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
Примечание. Делать это для типов со знаком гораздо сложнее, см. " Программирование определения максимального значения целого типа со знаком".