Я пишу привязку java для кода C, и я не совсем знаком с C.
У меня есть uint64_t, и мне нужно преобразовать его в int. Кто-нибудь знает как это сделать? (Моя привязка возвращается затем jint...)
Я пишу привязку java для кода C, и я не совсем знаком с C.
У меня есть uint64_t, и мне нужно преобразовать его в int. Кто-нибудь знает как это сделать? (Моя привязка возвращается затем jint...)
Обычно использование точного целого числа ширины, такого как «uint64_t», имеет вескую причину. Если вы приведете его к типу int, длина которого может быть меньше 64 бит, у вас могут возникнуть серьезные проблемы...
uint64_t
эквивалентен int
везде, где его можно использовать?
- person JohnK; 25.04.2013
int
зависит от реализации. На современных компьютерах это обычно 32 бита, но это может быть что угодно... Очевидно, что преобразование uint64_t
в int
может привести к усеченному целому числу...
- person Macmade; 25.04.2013
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 */
Если вы пишете оболочки JNI, лучшим соответствием для uint64_t будет long, а не int. Даже в этом случае вы потеряете точность, поскольку в Java нет беззнаковых типов (отсюда и u), и вы должны быть готовы проверить знак значения.
Обратите внимание, что java не поддерживает беззнаковые типы. Ближайший тип в java будет long, так как у него тоже 64 бита. Приведение uint64 к long не приводит к потере данных, потому что количество битов одинаковое, но тогда большие значения будут отображаться как отрицательные числа.
хм... У меня есть метод на 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; Все идет нормально...
jlong
кажется, отлично подходит для вашей цели.
- person Michael Foukarakis; 21.07.2010