Преобразуйте Java int в C unsigned int

#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) или изменение между версиями вашей библиотеки