От uint64_t до int
Я пишу Java-привязку для кода C, и я не очень знаком с C.
У меня есть uint64_t и мне нужно привести его к типу int. Кто-нибудь знает как это сделать? (Моя привязка возвращается, а затем...)
6 ответов
Обычно использование точного целого числа ширины, такого как uint64_t, является веской причиной. Если вы приведете его к типу int, длина которого не может быть 64 бита, у вас могут возникнуть серьезные проблемы...
Краткий ответ:
uint64_t foo;
int bar;
bar = foo;
Технически это имеет неопределенное поведение, если значение foo
не вписывается в int
, На практике это всегда будет просто урезать верхние биты. Если вы хотите быть более правильным, то:
if (foo-INT_MIN <= (uint64_t)INT_MAX-INT_MIN)
bar = foo;
else
/* error case here */
Если вы пишете обертки JNI, наилучшим соответствием для uint64_t будет long, а не int. Даже в этом случае вы потеряете точность, поскольку в Java нет неподписанных типов (отсюда и u), и вам нужно быть готовым проверить знак значения.
Обратите внимание, что Java не поддерживает неподписанные типы. Ближайший тип в Java будет длинным, так как он также имеет 64 бита. Преобразование uint64 в long не приводит к потере данных, поскольку число битов одинаково, но большие значения будут отображаться как отрицательные числа.
whatever_your_int_var_name_is = (int)whatever_your_uint64_t_var_name_is;
Хм... у меня есть метод в C, который возвращает page_ID, который является номером uint64_t. Теперь мне нужно сохранить этот номер в Java HashMap. Так как же лучше всего хранить этот uint64_t в Java HashMap? Проблема в том, что когда я выполняю операцию поиска, мне нужно взять это конкретное значение в HashMap и привести его обратно к uint64_t, чтобы я мог вызвать функцию в коде C, которая ожидает uint64_t в качестве аргумента.
PS Я сделал это с помощью jlong pid = (jlong) pid_in_uint64_t; Все идет нормально...