Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
1

Перевести биты int в unsigned int

10.10.2019, 17:33. Показов 5403. Ответов 56
Метки нет (Все метки)

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

Пример:
int - -2147483647
unsigned int - 0

int 0
unsigned int - 2147483647
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2019, 17:33
Ответы с готовыми решениями:

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

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

Определение типов. Приведение int к unsigned int
При таком определении 5 рассматривается как int. Как при определении указать что 5 будет именно...

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

56
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
10.10.2019, 18:05 2
Цитата Сообщение от k0vpack Посмотреть сообщение
как можно получить из int -> unsigned int, т.е. где все биты в таком же порядке, по идее тогда будет без минуса.
Ничего не понятно. Что значит "без минуса"? Что именно должно происходить с отрицательными значениями?

Цитата Сообщение от k0vpack Посмотреть сообщение
int - -2147483647
unsigned int - 0
Почему -2147483647 вдруг превратилось в 0?

Цитата Сообщение от k0vpack Посмотреть сообщение
int 0
unsigned int - 2147483647
Почему 0 превратился в 2147483647.

Как это связано с "битами"?
0
530 / 180 / 38
Регистрация: 18.08.2012
Сообщений: 904
11.10.2019, 04:27 3
abs(intval)
0
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
11.10.2019, 18:31  [ТС] 4
TheCalligrapher, так при signed последний бит отводиться на знак, а при unsigned - на число, выходит что максимальное число увеличиваеться в два раза, а минимальным становиться ноль. Значит минимальное при int != минимальному при unsigned int, и так же с максимальный
0
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
11.10.2019, 18:45 5
k0vpack, ну так прибавьте тогда к инту 2147483647, что мешает?

Добавлено через 1 минуту
C++
1
2
3
unsigned ui;
int n = 10;
ui = n + 2147483647;
или
C++
1
ui = n + INT_MAX;
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
11.10.2019, 19:20 6
Цитата Сообщение от k0vpack Посмотреть сообщение
TheCalligrapher, так при signed последний бит отводиться на знак, а при unsigned - на число, выходит что максимальное число увеличиваеться в два раза, а минимальным становиться ноль. Значит минимальное при int != минимальному при unsigned int, и так же с максимальный
Это все прекрасно. Но вы по-прежнему не ответили на вопрос, откуда взялись такие странные значения из примеров в вашем вопросе. Почему -2147483647 вдруг превратилось в 0? Почему 0 превратился в 2147483647?

Для того, чтобы перевести значение int в тип unsigned int ничего делать не надо - это преобразование является встроенным свойством языка. Вас языковое преобразование чем-то не устраивает? Да? Нет? Если нет, что чем?

По какому правилу/закону выполняется перевод? Почему оно до сих пор не приведено? Что вам надо сделать? Где ответы на эти вопросы?
0
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
11.10.2019, 19:21 7
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
По какому правилу/закону выполняется перевод?
Просто сдвиг по оси.
Например: интервал от -10 до 10 он переводит в интервал от 0 до 20 (я так понял)
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
11.10.2019, 19:23 8
Цитата Сообщение от Avaddon74 Посмотреть сообщение
unsigned ui;
int n = 10;
ui = n + 2147483647;
https://wandbox.org/permlink/jMesXyQ1UclaQFt3
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
11.10.2019, 19:24 9
Цитата Сообщение от Avaddon74 Посмотреть сообщение
Просто сдвиг по оси.
Если нужен "сдвиг по оси", то почему в заголовке вопроса речь идет о некоем "перевести биты"? При чем здесь "перевод битов"?
0
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
11.10.2019, 19:26 10
rat0r, да я пример привел, т.е. идею, это не значит что нужно делать именно так

Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
то почему в заголовке ...
1. неправильная формулировка вопроса
2. я не правильно понял
0
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
11.10.2019, 19:49  [ТС] 11
Avaddon74, TheCalligrapher, rat0r, к примеру, есть число (в двоичной системе) 11111111 = (в десятичной) 128 - это как бы unsigned int, а если последний бит отвести на знак, то это число будет -68, а при 01111111 будет 67.
0
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
11.10.2019, 19:56 12
Цитата Сообщение от k0vpack Посмотреть сообщение
11111111
это 255 в unsigned char и -1 в signed
0
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
11.10.2019, 19:59  [ТС] 13
Цитата Сообщение от Avaddon74 Посмотреть сообщение
это 255 в unsigned char и -1 в signed
да, напутал со степенью, но сути не меняет.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
11.10.2019, 20:10 14
Цитата Сообщение от k0vpack Посмотреть сообщение
а если последний бит отвести на знак
Старший бит да, отвечает за знак, только отсчёт отрицательных чисел идёт от 11111111 по убыванию, а не например от 10000000 по возрастанию.
0
Заблокирован
11.10.2019, 22:49 15
k0vpack, Так чего ж ты хочешь-то, в конце-то концов, ёмаё???
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
11.10.2019, 23:22 16
k0vpack,
C++
1
2
3
int signedNum = -1;
unsigned int unsignedNum = 0;
std::memcpy(&unsignedNum, &signedNum, sizeof(signedNum));
Начиная с C++20 можно делать вот так:
C++
1
2
3
4
#include <bit>
 
int signedNum = -1;
unsigned int unsignedNum = std::bit_cast<unsigned int>(signedNum);
Под капотом скорее всего будет тот же memcpy.
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
12.10.2019, 00:24 17
Цитата Сообщение от nonedark2008 Посмотреть сообщение
C++
1
2
int signedNum = -1;
unsigned int unsignedNum = 0;
int к unsgined int можно кастить без memcpy - это well-defined

Добавлено через 11 минут
If the destination type is unsigned, the resulting value is the least unsigned integer congruent to the source
integer (modulo 2n where n is the number of bits used to represent the unsigned type).
Впрочем как и unsigned int к int.
If the destination type is signed, the value is unchanged if it can be represented in the destination type;
otherwise, the value is implementation-defined.
Кстати с С++20 эту строку убрали из стандарта, это видимо из-за изменения представления int'ов.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
12.10.2019, 00:33 18
Цитата Сообщение от Azazel-San Посмотреть сообщение
int к unsgined int можно кастить без memcpy - это well-defined
Если я правильно понял ТС, то ему необходимо преобразовать число одного типа в число другого типа с сохранением значениq всех битов. Я специально не смотрел, но предположу, что стандарт не гарантирует того, что при обычном касте биты не поменяются.
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
12.10.2019, 01:10 19
nonedark2008, ну как бы из знакового в беззнаковый как раз гарантирует, я же привёл цитату.
И раз речь зашла о с++20, то есть вероятность что и знаковый в беззнаковый кастится без проблем, тк в с++20 знаковые теперь представлены иначе и переполнение знаковых не UB.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
12.10.2019, 01:31 20
Цитата Сообщение от nonedark2008 Посмотреть сообщение
int signedNum = -1;
unsigned int unsignedNum = 0;
std::memcpy(&unsignedNum, &signedNum, sizeof(signedNum));
Насколько мне известно, UB. memcpy-то между двумя объектами одного trivially copyable типа "разрешён" только ненормативной сноской, а между разными типами это вообще ХЗ что значит.

Цитата Сообщение от Azazel-San Посмотреть сообщение
И раз речь зашла о с++20, то есть вероятность что и знаковый в беззнаковый кастится без проблем
Да, с "сохранением" значений соответствующих битов.
1
12.10.2019, 01:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2019, 01:31
Помогаю со студенческими работами здесь

Надо перевести переменную типа unsigned char* в signed int и обратно
у меня есть переменная типа unsigned char*, мне нужно перевести ее в signed int , провести...

Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec
Вот есть заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H ...

[C++ Error] Unit2.cpp(22): E2034 Cannot convert 'int (*)(int,int *)' to 'int'
Всем привет! Пожалуйста , помогите , почему выдает ошибку Unit2.cpp(22): E2034 Cannot convert 'int...

Перевести long long unsigned int в массив char
Подскажите, пожалуйста, как превратить число типа long long unsigned int в массив символов? Каждый...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru