От 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; Все идет нормально...

Другие вопросы по тегам