Лучший способ конвертировать uint64_t в jlong

0

Я пишу код JNI и сталкиваюсь с ситуацией, когда мне понадобится преобразовать uint64_t в jlong, и вот мой текущий способ конвертировать uint64_t в jlong:

jlong uint64_t_to_jlong (uint64_t value) {
  if (value > std::numeric_limits<jlong>::max()) {
    return std::numeric_limits<jlong>::max(); 
  }
  return static_cast<jlong>(value);
}

И это, очевидно, не идеальный подход, так как он не может действительно правильно преобразовать значение, когда value > std::numeric_limits<jlong>::max(). Однако прямое возвращение static_cast<jlong>(value) тоже не очень подходит для меня, так как на стороне Java мы получим отрицательное значение.

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

  • 0
    Что вы хотите, чтобы произошло, когда значение больше 2 ^ 63? Ваши единственные параметры приводятся к соответствующему отрицательному значению или генерируют исключение, поскольку в Java нет 64-разрядного примитивного целого типа без знака.
  • 0
    Так есть ли какой-нибудь стандартный способ преобразования такого отрицательного значения в сторону Java? Я беспокоюсь о том, что это платформа или нет.
Показать ещё 4 комментария
Теги:
jni
uint64

1 ответ

0
Лучший ответ

Как было предложено в комментарии Луи, один из способов справиться с этим в Java 8 состоит в том, чтобы просто uint64_t в jlong на стороне C++, а затем использовать набор неподписанных операций, предоставляемых Java 8, таких как Long.compareUnsigned(), чтобы сделать необходимая операция:

public static int compareUnsigned(long x, long y)
Compares two long values numerically treating the values as unsigned.

Неподготовленные библиотеки Google Guava также могут достичь этого, если Java 8 не используется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню