it-swarm-ru.tech

преобразование int в unsigned int

Я просто поражен, узнав, что я не могу преобразовать подписанное в unsigned int путем приведения!

int i = -62;
unsigned int j = (unsigned int)i;

Я думал, что уже знал это, так как я начал использовать броски, но я не могу этого сделать!

37
John

Вы можете преобразовать int в unsigned int. Преобразование является действительным и четко определенным.

Поскольку значение отрицательное, UINT_MAX + 1 добавляется к нему, так что значение является действительным количеством без знака. (Технически, 2N к нему добавляется, где N - количество битов, используемых для представления типа без знака.)

В этом случае, поскольку int на вашей платформе имеет ширину 32 бита, 62 вычитается из 232, уступая 4 294 967 234.

43
James McNellis

Редактировать : Как было отмечено в других ответах, стандарт фактически гарантирует, что " полученное значение является наименее целым числом без знака, соответствующим конгруэнтности. исходное целое число (по модулю 2n, где n - количество бит, используемых для представления типа без знака) ". Таким образом, даже если ваша платформа не хранит подписанные целые числа как дополнение к двум, поведение будет таким же.


Видимо, ваше подписанное целое число -62 хранится в дополнении к двум ( Wikipedia ) на вашей платформе:

62 как 32-разрядное целое число, записанное в двоичном виде

0000 0000 0000 0000 0000 0000 0011 1110

Чтобы вычислить дополнение двух (для хранения -62), сначала инвертируйте все биты

1111 1111 1111 1111 1111 1111 1100 0001

затем добавьте один

1111 1111 1111 1111 1111 1111 1100 0010

И если вы интерпретируете это как 32-разрядное целое число без знака (как ваш компьютер будет делать, если вы его приведете), вы получите 4294967234 :-)

35
puzzle

Это преобразование четко определено и даст значение UINT_MAX - 61. На платформе, где unsigned int - это 32-битный тип (в наши дни это самые распространенные платформы), это именно то значение, о котором сообщают другие. Другие значения возможны, однако.

Фактический язык в стандарте

Если тип назначения является беззнаковым, полученное значение является наименьшим целым числом без знака, соответствующим исходному целому числу (по модулю 2 ^ n, где n - число битов, используемых для представления типа без знака).

4
Stephen Canon

я = -62. Если вы хотите преобразовать его в беззнаковое представление. Это было бы 4294967234 для 32-разрядного целого числа. Простой способ будет

num=-62
unsigned int n;
n = num
cout<<n;

4294967234

1
Himanshu Poddar

с небольшой помощью математики

#include <math.h>
int main(){
  int a = -1;
  unsigned int b;
  b = abs(a);
}
1
kubio