Я просто удивлен, узнав, что я не могу преобразовать подписанный в unsigned int путем кастинга!
int i = -62;
unsigned int j = (unsigned int)i;
Я думал, что уже знал об этом, так как начал использовать касты, но я не могу этого сделать!
Я просто удивлен, узнав, что я не могу преобразовать подписанный в unsigned int путем кастинга!
int i = -62;
unsigned int j = (unsigned int)i;
Я думал, что уже знал об этом, так как начал использовать касты, но я не могу этого сделать!
Вы можете преобразовать int
в unsigned int
. Преобразование действительно и четко определено.
Так как значение отрицательное, к нему добавляется UINT_MAX + 1
, так что значение является допустимой величиной без знака. (Технически добавляется 2 N где N - количество бит, используемых для представления неподписанного типа.)
В этом случае, поскольку int
на вашей платформе имеет ширину 32 бита, 62 вычитается из 2 32 что дает 4 294 967 234.
Изменить. Как было отмечено в других ответах, стандарт фактически гарантирует, что "результирующее значение является наименьшим беззнаковым целым, совпадающим с исходным целым числом (по модулю 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: -)
Это преобразование хорошо определено и даст значение UINT_MAX - 61
. На платформе, где unsigned int
- это 32-разрядный тип (большинство распространенных платформ, в наши дни), это именно то значение, которое другие сообщают. Однако возможны другие значения.
Фактический язык в стандарте
Если тип назначения не указан, результирующее значение является наименьшим беззнаковое целое, совпадающее с (по модулю 2 ^ n, где n равно количество бит, используемых для представления неподписанный тип).
с небольшой помощью математики
#include <math.h>
int main(){
int a = -1;
unsigned int b;
b = abs(a);
}
Так как мы знаем, что i
является int
, вы можете просто продолжить его и неподписывать!
Это сделало бы трюк:
int i = -62;
unsigned int j = unsigned(i);