uint64 t к int



Я пишу привязку java для кода C, и я действительно не знаком с C.



У меня есть uint64_t, и мне нужно привести его к int. Кто-нибудь знает, как это сделать?
(Моя привязка возвращает тогда jint...)

576   6  

6 ответов:

Обычно использование точного целого числа ширины, такого как' uint64_t', имеет веские основания. Если вы приведете его к int, который не может быть 64bits long, у вас могут возникнуть серьезные проблемы...

Краткий ответ:

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 будет long, так как он также имеет 64 бита. Приведение uint64 к long не приводит к потере данных, потому что количество битов одинаковое,но большие значения будут отображаться как отрицательные числа.

Хм... У меня есть метод в C, который возвращает page_ID, который является номером uint64_t. Теперь мне нужно сохранить это число в хеш-карте Java. Итак, как лучше всего хранить этот uint64_t в хеш-карте Java? Проблема в том, что когда я выполняю операцию поиска, мне нужно взять это конкретное значение в хэш-карте и привести его обратно к uint64_t, чтобы я мог вызвать функцию в коде C, которая ожидает uint64_t в качестве аргумента.

P.S. Я сделал это с jlong pid = (jlong) pid_in_uint64_t; так далеко так хорошо...

whatever_your_int_var_name_is = (int)whatever_your_uint64_t_var_name_is;

Comments

    Ничего не найдено.