Как конвертировать long long в unsigned int в C / C ++ - PullRequest
0 голосов
/ 04 июня 2019

Я читаю из файла JSON, используя библиотеку jannson. Ключ, для которого я читаю, имеет значение типа unsigned int. Дженнсон не может распознать unsigned int. Итак, я читаю значение как long long. Как мне безопасно преобразовать это long long значение в unsigned int?

Ответы [ 3 ]

3 голосов
/ 04 июня 2019

Чтобы избежать сужения ошибок преобразования, безопаснее использовать - numeric_cast

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

Если безопасность не является главным приоритетом (или вы уверены, что unsigned int всегда достаточно, чтобы содержать значение long long), чем использовать:

static_cast<unsigned int>(llval)
2 голосов
/ 04 июня 2019

Как конвертировать long long в unsigned int в C / C ++?

Проверьте, находится ли значение в диапазоне.
C решение:

#include <stdbool.h>
#include <limits.h>

// return error status 
bool ll_to_u(unsigned *y, long long x) {
  if (x < 0) {
    return true;
  }
  #if LLONG_MAX > UINT_MAX
  if (x > UINT_MAX) {
    return true;
  }
  #endif
  *y = (unsigned) x;
  return false;
}
1 голос
/ 04 июня 2019

Как безопасно преобразовать это long long значение в unsigned int?

Примерно так:

long long input = ...
if (input < 0)
    throw std::runtime_error("unrepresentable value");
if (sizeof(unsigned) < sizeof(long long)
&& input > static_cast<long long>(std::numeric_limits<unsigned>::max()))
    throw std::runtime_error("unrepresentable value");
return static_cast<unsigned>(input);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...