от uint64_t до int - PullRequest
       15

от uint64_t до int

2 голосов
/ 21 июля 2010

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

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

Ответы [ 6 ]

6 голосов
/ 21 июля 2010

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

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 */
6 голосов
/ 21 июля 2010

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

3 голосов
/ 21 июля 2010

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

2 голосов
/ 21 июля 2010

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

1 голос
/ 21 июля 2010
whatever_your_int_var_name_is = (int)whatever_your_uint64_t_var_name_is;
0 голосов
/ 21 июля 2010

хм ... У меня есть метод в 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;пока все хорошо ...

...