Пределы тип переменных C++

вот довольно простой вопрос (я думаю), существует ли метод библиотеки STL, который обеспечивает предел типа переменной (например, целое число)? Я знаю, что эти пределы расходятся в различных компьютерах, но должен быть способ получить их через метод, правильно?

Кроме того, было бы действительно трудно записать метод для вычисления предела типа переменной?

Мне просто любопытно!:)

Спасибо ;).

12
задан Jesse Emond 18 July 2010 в 12:41
поделиться

4 ответа

Используйте std::numeric_limits:

// numeric_limits example
// from the page I linked
#include <iostream>
#include <limits>
using namespace std;

int main () {
  cout << boolalpha;
  cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
  cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;
  cout << "int is signed: " << numeric_limits<int>::is_signed << endl;
  cout << "Non-sign bits in int: " << numeric_limits<int>::digits << endl;
  cout << "int has infinity: " << numeric_limits<int>::has_infinity << endl;
  return 0;
}
38
ответ дан 2 December 2019 в 03:01
поделиться

Я вижу, что "правильный" ответ уже дан: Используйте <ограничения> и позвольте магии произойти. Я нахожу этот ответ неудовлетворительным, так как вопрос стоит так:

Неужели будет действительно сложно написать метод вычисления предела типа переменной?

Ответ: легко для целочисленных типов, трудно для типов с плавающей точкой. Есть 3 основных типа алгоритмов, которые вам понадобятся. знаковый, беззнаковый и с плавающей точкой. Каждый из них имеет свой алгоритм получения min и max, а реальный код включает в себя некоторое скручивание, и в случае с плавающей точкой, вам придется зацикливаться, если у вас нет известного целочисленного типа, который имеет тот же размер, что и тип float.

Итак, вот оно.

Беззнаковый - это просто. min - это когда все биты равны 0, max - когда все биты равны 1. Для signed, min - это когда знаковый бит установлен, но все остальные биты - нули, max - когда все биты, кроме знакового бита, установлены. Существует потенциально много способов представления чисел с плавающей точкой, но для тех, кто использует двоичное (а не базовое 10) представление с плавающей точкой, почти все используют представления IEEE.

Для IEEE floats наименьшее положительное значение с плавающей точкой - это когда младший бит экспоненты равен 1, а все остальные биты - 0. Самое большое отрицательное значение с плавающей точкой - это бит, обратный этому. Однако, без целочисленного типа, который, как известно, имеет тот же размер, что и данный тип с плавающей точкой, нет никакого другого способа манипулировать битами, кроме как выполнять цикл. Если у вас есть целочисленный тип, который, как вы знаете, имеет тот же размер, что и ваш тип с плавающей точкой, вы можете сделать это как единственную операцию.

const float_type get_float_type_smallest() {
   const float_type float_1 = (float_type)1.0;
   const float_type float_2 = (float_type)0.5;
   union {
      byte ab[sizeof(float_type)];
      float_type fl;
      } u;
   for (int ii = 0; ii < 0; ++ii)
      u.ab[ii] = ((byte*)&float_1)[ii] ^ ((byte*)&float_2)[ii];
   return u.fl;
   }

const float_type get_float_type_largest() {
   union {
      byte ab[sizeof(float_type)];
      float_type fl;
      } u;
   u.fl = get_float_type_smallest();
   for (int ii = 0; ii < 0; ++ii)
      u.ab[ii] = ~u.ab[ii];
   return -u.fl; // Need to re-invert the sign bit.
   }
12
ответ дан 2 December 2019 в 03:01
поделиться

(относящиеся к Си, но я думаю, что это относится и к Си++)

Можно также попробовать "enquire", который представляет собой скрипт, способный воссоздать limits.h для вашего компилятора. Цитата с домашней страницы проектора:

Это программа, которая определяет много свойства компилятора Си и машина, на которой она работает, например минимальный и максимальный [без] подписанного чар/мин/долго, многие свойства float/ [long] double, и т.д.

В качестве опции он производит ANSI C float.h и limits.h файлы.

В качестве дополнительной опции, он даже проверяет что компилятор читает заголовок файлы правильно.

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

4
ответ дан 2 December 2019 в 03:01
поделиться
#include <limits>

std::numeric_limits<type>::max() // min() etc
2
ответ дан 2 December 2019 в 03:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: