#java #c
Вопрос:
Мне интересно, можно ли было бы преобразовать Java int
в C unsigned int
, особенно если Java int
отрицательна?
Редактировать в ответ на комментарии: преобразование выполняется не через JNI, а скорее у меня есть набор int
, которые записываются в хранилище библиотекой Java. Существует версия этой библиотеки на языке Си, но она использует unsigned int
. Я хочу использовать библиотеку C для чтения int
сохраненных библиотек Java.
Комментарии:
1. Что вы подразумеваете под преобразованием между типами java и C? Ты говоришь о ДЖНИ?
2. @dan1st: Я обновил вопрос, чтобы прояснить процесс преобразования.
3. Возможно, вы слишком много думаете об этом. Если у вас есть две библиотеки, обслуживающие один и тот же формат файла, то первым правильным предположением будет то, что они совместимы. Есть ли у вас основания полагать, что это не так?
4. @JohnBollinger: К сожалению, библиотеки не совместимы на основе моих экспериментов.
5. @swap310, то, скорее всего, либо ваши ожидания неверны, либо одна из библиотек нарушена. У нас недостаточно информации, чтобы сказать, какая именно.
Ответ №1:
Если C unsigned int
равен 32 битам, то Java int
содержит точно такое же двоичное значение, даже если оно отрицательное. Предполагая, что вы хотите преобразовать его в эквивалентное положительное значение, вы ищете либо Integer::toUnsignedString
или Integer::toUnsignedLong
. Если вы хотите передать значение в библиотеку C с помощью JNI, то оно уже имеет желаемое двоичное значение.
В ответ на ваше редактирование, опять же, если библиотека C использует 32-разрядные int (возможно, это не так), она просто получит значение без знака. Таким образом, если код Java написал значение -2
( 0xfffffffe
), то библиотека C будет считываться 4294967294
, всегда предполагая, что они используют один и тот же конец для чисел.
(Java ObjectOutputStream или DataOutputStream будут записывать байты в порядке большого конца, и на многих архитектурах C будет использоваться язык малого конца, но, предположительно, версии библиотеки Java и C предназначены для использования одного и того же конца.)
Ответ №2:
Это зависит от вашей библиотеки.
Если предположить, что версии библиотеки на C и Java используют один и тот же формат (файл), есть четыре возможности для отрицательных чисел/чисел, выходящих за пределы подписанного ввода:
Переполнение
Это может просто переполниться, так что значение java int будет отрицательным, в то время как C unsigned int
будет числом >=2^31.
Исключение/Ошибка
Библиотека может просто выдать исключение (это может быть указано с помощью специального возвращаемого значения или флага).
Особая ценность
Для этого случая может быть специальное значение, например Integer.MAX_VALUE
, для числа с высоким значением или 0
для отрицательного числа.
Не допускайте хранения
Библиотека может просто не позволять хранить отрицательные/слишком большие числа.
Какой выбор будет использован, зависит от вашей библиотеки. Возможно, вы захотите ознакомиться с документацией или просто попробовать ее.
Это также может быть неопределенное/определенное поведение реализации, комбинация этих случаев (отличающаяся между реализациями C и Java) или изменение между версиями вашей библиотеки