Подтвердить что ты не робот

Int для беззнакового преобразования int

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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


Очевидно, ваше подписанное целое число -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: -)

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

Так как мы знаем, что i является int, вы можете просто продолжить его и неподписывать!

Это сделало бы трюк:

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