uint64_t в целое число

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

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


person mkn    schedule 21.07.2010    source источник


Ответы (5)


Обычно использование точного целого числа ширины, такого как «uint64_t», имеет вескую причину. Если вы приведете его к типу int, длина которого может быть меньше 64 бит, у вас могут возникнуть серьезные проблемы...

person Macmade    schedule 21.07.2010
comment
Итак, что же можно сделать, чтобы избежать проблем? Или uint64_t эквивалентен int везде, где его можно использовать? - person JohnK; 25.04.2013
comment
Размер int зависит от реализации. На современных компьютерах это обычно 32 бита, но это может быть что угодно... Очевидно, что преобразование uint64_t в int может привести к усеченному целому числу... - person Macmade; 25.04.2013
comment
Этот вопрос был о Java, и, насколько мне известно, такого понятия, как long long, не существует. В C проблема та же. Хотя это практически работает в большинстве сегодняшних реализаций, размер long long по-прежнему определяется реализацией. Так что никогда не полагайтесь на это. - person Macmade; 25.04.2013

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

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 */
person R.. GitHub STOP HELPING ICE    schedule 21.07.2010

Если вы пишете оболочки JNI, лучшим соответствием для uint64_t будет long, а не int. Даже в этом случае вы потеряете точность, поскольку в Java нет беззнаковых типов (отсюда и u), и вы должны быть готовы проверить знак значения.

person Tassos Bassoukos    schedule 21.07.2010
comment
есть ли способ сохранить uint64_t C в java? В моем случае uint64_t всегда положительное число. - person mkn; 21.07.2010
comment
Если вы хотите, чтобы uint64_t просто передал его в java в качестве идентификатора (и обратно в C), используйте long - деградации не будет, но значения больше 2^63 станут отрицательными - long имеет 64 бита по определению, но использует бит в качестве знака. - person Tassos Bassoukos; 21.07.2010

Обратите внимание, что java не поддерживает беззнаковые типы. Ближайший тип в java будет long, так как у него тоже 64 бита. Приведение uint64 к long не приводит к потере данных, потому что количество битов одинаковое, но тогда большие значения будут отображаться как отрицательные числа.

person codymanix    schedule 21.07.2010

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

P.S. я сделал это с помощью jlong ​​pid = (jlong) pid_in_uint64_t; Все идет нормально...

person mkn    schedule 21.07.2010
comment
jlong кажется, отлично подходит для вашей цели. - person Michael Foukarakis; 21.07.2010