Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
MMStudent
0 / 0 / 0
Регистрация: 23.12.2010
Сообщений: 9
1

Как перевести сишный unsigned int в явский int?

31.05.2011, 12:21. Просмотров 1566. Ответов 6
Метки нет (Все метки)

Кто-нибудь занимался подобным переводом кода?
Поначалу я думал, что разницы вообще нет, просто
есть знаковое представление и слегка меняются побитовые сдвиги.
Но потом стало ясно, что отличия появляются при работе с массивами -
сложение, умножение и т. п. другое, поскольку меняется значение переноса. В Long'е хранить тоже нежелательно. Пока что я во всех местах вставил умножение на 0xffffffffL, что дает как раз беззнаковое значение. Но это довольно громоздко. Наверняка есть что-то проще. Что посоветуете?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2011, 12:21
Ответы с готовыми решениями:

Depricated public Date(int year,int Month, int Day)
Конструктор public Date(int year,int Month, int Day) Depricated вместо него советуют использовать...

Как достать int из Vector'а?
Заполняю вектор некоторыми натуральными числами, потом надо достать их оттуда в их оригинальном...

Как же быть с форматом записи int
Проблема возникла (собственно не проблема, а вопрос) с сохранением двоичных данных в java....

Как указать int в таком случае ?
Вот такой код. Как указать int в строчке Dog Dog = new Dog ... ? По умолчанию выходит String z, а...

Как перевести число int в массив int digits[]
String fileName1=123456; int n=fileName1.length(),i=0; int digits = new int; ...

6
paradise
31.05.2011, 13:34 2
Из твоего сообщения непонятно, что значит 'перевести'.

Кроме того, int в Java знаковый целый тип (кроме char все знаковые). Т.е. значения после 0x7FFFFFFF по разному интерпритируются. В С++ 0x80000000 будет равно '2147483648', а в Java - '-2147483648' в десятичной СС.

Битовое представление будет одно и тоже.
MMStudent
0 / 0 / 0
Регистрация: 23.12.2010
Сообщений: 9
31.05.2011, 14:39  [ТС] 3
Перевести означает, что код должен работать так же, то есть на выходе получаем инты, эквивалентные беззнаковым в си.
В каком смысле по-разному интерпретируются? Соответствие между беззнаковым интом в си и интом в JAVA задается однозначно: числа от 0 до 2^31-1 сохраняются, а от 2^31 до 2^32-1 нет - от них вычитается 2^32. Именно поэтому 10 должно быть меньше -1 при таком переводе.
Поэтому a<b не то же самое, что a-b<0. И приходится писать a & 0xffffffffL < b & 0xffffffffL, а уже потом результат приводить к инту. Битовые операции тоже отличаются, поскольку при сдвиге вправо числа, у которого в старшем разряде 1(то есть отрицательного в JAVA), знак сохраняется. Поэтому приходиться везде менять >> на >>>.
0
paradise
31.05.2011, 14:57 4
>2^32-1 нет - от них вычитается 2^32.

Я всегда считал, что они просто храняться в дополнительном коде.

>Именно поэтому 10 должно быть меньше -1 при таком переводе.

В Java 10 > -1 в любой ситуации.

>И приходится писать a & 0xffffffffL < b & 0xffffffffL, а уже потом
>результат приводить к инту. Битовые операции тоже отличаются, поскольку
>при сдвиге вправо числа, у которого в старшем разряде 1(то есть
>отрицательного в JAVA), знак сохраняется. Поэтому приходиться везде
>менять >> на >>>.

Все это правильно и обойти это в Java более простыми методами нельзя.
Беззнаковых целых - нет, операторы переопределить нельзя.

Альтернатива _a & 0xffffffffL_ - хранить твои числа в long. Но, как видно из первого поста - это тебе не подходит.
paradise
31.05.2011, 14:59 5
Кроме того, результатом операции 'a & 0xffffffffL' является не беззнаковое, а знаковое размером long, состоящее из битового представления 'a', дополненного до размера long нулевыми битами.
paradise
31.05.2011, 15:03 6
Возможно, для твоей задачи можно приспособить BigInteger из пакета java.math. Попробуй.
MMStudent
0 / 0 / 0
Регистрация: 23.12.2010
Сообщений: 9
31.05.2011, 15:36  [ТС] 7
В этом-то все и дело. Эти проблемы возникли как раз при переходе к более быстрой арифметике. Сишный код, который я перевожу, работает намного быстрее явского BigInteger(оптимизировано умножение,возведение в степень и т.п.), что важно в моей ситуации. К тому же мне необходимо работать с интовыми массивами фиксированной длины, а BigInteger уже при инициализации обрезает нули спереди. Такие вот пироги. Спасибо за помощь, paradise, ты единственный, кто откликнулся.
0
31.05.2011, 15:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2011, 15:36

Реализуйте статический метод d(int a, int b, int c), который возвращает дискриминант b2-4*a*c квадратного уравнения.
Ребят, помогите решить задачи какие сможете... 1. Реализуйте статический метод d(int a, int b,...

unsigned int в java
Какой аналог unsigned int в java?

решил написать программу квадрат пифагора, я начинающий. как int перевести в строки
Здраствуйте. Я начинающий на джава, еще плохо разобрался в этом языке, решил написать программу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru