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

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

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

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

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

Размерность int или как из signed int сделать unsigned int?
Добрый день. Есть старая база уже с некоторыми данными. При развёртывании её на одном из тестовых...

Перевести биты int в unsigned int
Доброго времени суток, как можно получить из int -> unsigned int, т.е. где все биты в таком же...

Как массив char[4] перевести в unsigned int?
Есть массив из 4х char символов (4-е байта), нужно его перевести в unsigned int. Я сделал втупую:...

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

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

Битовое представление будет одно и тоже.
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. Попробуй.
0 / 0 / 0
Регистрация: 23.12.2010
Сообщений: 9
31.05.2011, 15:36  [ТС] 7
В этом-то все и дело. Эти проблемы возникли как раз при переходе к более быстрой арифметике. Сишный код, который я перевожу, работает намного быстрее явского BigInteger(оптимизировано умножение,возведение в степень и т.п.), что важно в моей ситуации. К тому же мне необходимо работать с интовыми массивами фиксированной длины, а BigInteger уже при инициализации обрезает нули спереди. Такие вот пироги. Спасибо за помощь, paradise, ты единственный, кто откликнулся.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2011, 15:36

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как исправить ошибку невозможно преобразовать аргумент 1 из "unsigned int" в "unsigned int []"?
Ребят, срочно прошу вас помочь.. Есть ошибка (невозможно преобразовать аргумент 1 из &quot;unsigned...

Как преобразовать int в unsigned int
Подскажите, как преобразовать int в unsigned int в языке C. Пробовал так: int sum; sum =...

Какая из этих функций int Q(int w) int W(int y,int u,int i) сработает быстрее?
Если есть 2 функции(простые или перегруженные) к примеру Q(int w) int W(int y,int u,int i)или int...

Поместить двоичный код, в веденной строке, в переменную типа int и unsigned int.
Пользователь вводит двоичную строку (32 символа). Поместить двоичный код, в веденной строке, в...


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

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

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