Вопрос

У меня очень простой вопрос.Для следующего кода:

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, и сохраняется независимо от того, использует ли машина представление величины до двух, до одного или со знаком.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top