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; так далеко так хорошо...
Comments