Какой реальный нижний предел для длинных (подписанных) длинных? - PullRequest
6 голосов
/ 21 мая 2011

Проверка пределов типа long long с помощью

std::cout << std::numeric_limits<long long>::min();

Я получаю -9223372036854775808

Однако при компиляции следующего кода:

int main() {
   long long l;
   l=-9223372036854775808LL;
}

Я получаю предупреждения:

test.cpp:3:7: warning: integer constant is so large that it is unsigned.
test.cpp:3: warning: this decimal constant is unsigned only in ISO C90

Что мне не хватает? Заранее большое спасибо за вашу помощь.

Giorgio

Ответы [ 3 ]

13 голосов
/ 21 мая 2011

Это 9223372036854775808LL является положительным числом. Так что нужно взять

std::cout << std::numeric_limits<long long>::max();

во внимание. Отрицание этого сразу же не делает операнд самого оператора - отрицательным.

1 голос
/ 21 мая 2011

Отлично работает с std :: numeric и boost :: numeric; он не дает никаких предупреждений.

#include <iostream>
#include <boost/numeric/conversion/bounds.hpp>
#include <boost/limits.hpp>

int main(int argc, char* argv[]) {

  std::cout << "The minimum value for long long:\n";
  std::cout << boost::numeric::bounds<long long>::lowest() << std::endl;
  std::cout << std::numeric_limits<long long>::min() << std::endl << std::endl;

  std::cout << "The maximum value for long long:\n";
  std::cout << boost::numeric::bounds<long long>::highest() << std::endl;
  std::cout << std::numeric_limits<long long>::max() << std::endl << std::endl;

  std::cout << "The smallest positive value for long long:\n";
  std::cout << boost::numeric::bounds<long long>::smallest() << std::endl << std::endl;


  long long l;
  l = boost::numeric::bounds<long long>::lowest();
  std::cout << l << std::endl;
  l = std::numeric_limits<long long>::min();
  std::cout << l << std::endl;


  return 0;
}
0 голосов
/ 21 мая 2011

В моей системе.

   {LLONG_MIN}
          Minimum value of type long long.
          Maximum Acceptable Value: -9223372036854775807

   {LLONG_MAX}
          Maximum value of type long long.
          Minimum Acceptable Value: +9223372036854775807

см. Ваш limits.h файл

Также его можно найти по:

min : - 2^(sizeof (long long) - 1) - 1

max : + 2^(sizeof (long long) - 1)

...