двоичное представление в турбо c
Вопрос
У меня очень простой вопрос.Для следующего кода:
int i = -1;
unsigned int j = (unsigned int) i;
printf("%d",j); // I get 65535 the int limit in turbo C 16 bit compiler
Разве он не должен просто отбросить отрицательный знак или выйти за пределы?
Решение
Схема, наиболее часто используемая для представления отрицательных чисел, называется Дополнение двойки.В этой схеме -1
имеет битовую структуру всех 1
биты: 1111 1111 1111 1111
.Если интерпретировать как целое число без знака, что и означает ваше приведение, это будет 65535.
Другими словами, он «просто отбрасывает отрицательный знак», за исключением того, что это имеет эффект, отличный от ожидаемого.
Другие советы
При преобразовании int
к unsigned int
, если значение отрицательное, результат будет таким, как если бы это отрицательное значение было добавлено к числу на единицу больше, чем то, которое unsigned int
может держать.Это определено стандартом C, начиная с C90, и сохраняется независимо от того, использует ли машина представление величины до двух, до одного или со знаком.