Как привести или преобразовать беззнаковое int в int в C? - PullRequest
15 голосов
/ 26 февраля 2011

Мои извинения, если вопрос кажется странным. Я отлаживаю свой код, и это, кажется, проблема, но я не уверен.

Спасибо!

Ответы [ 6 ]

24 голосов
/ 26 февраля 2011

Это зависит от того, какое поведение вы хотите.int не может содержать многие значения, которые может unsigned int.

Вы можете разыграть как обычно:

int signedInt = (int) myUnsigned;

, но это вызовет проблемы, если значение unsignedмимо максимума int может удержаться.Это означает, что половина возможных значений unsigned приведет к ошибочному поведению, если вы не будете особо следить за этим.

Вы, вероятно, должны сначала пересмотреть, как вы храните значения в первую очередь, если вам нужно преобразовать без уважительной причины.

РЕДАКТИРОВАТЬ: Как упоминается ProdigySim вкомментарии, максимальное значение зависит от платформы.Но вы можете получить к нему доступ с помощью INT_MAX и UINT_MAX.

Для обычных 4-байтовых типов:

4 bytes = (4*8) bits = 32 bits

Если используются все 32 бита, как в unsigned,максимальное значение будет 2 ^ 32 - 1 или 4,294,967,295.

Знак int со знаком эффективно жертвует одним битом для знака, поэтому максимальное значение будет 2 ^ 31 - 1 или 2,147,483,647.Обратите внимание, что это половина другого значения.

3 голосов
/ 26 февраля 2011

Беззнаковое целое можно преобразовать в подписанное (или наоборот) с помощью простого выражения, как показано ниже:

unsigned int z;
int y=5;
z= (unsigned int)y;   

Хотя это и не предназначено для вопроса, вы хотели бы прочитать следующие ссылки:

2 голосов
/ 26 февраля 2011

Если у вас есть переменная unsigned int x;, вы можете преобразовать ее в int, используя (int)x.

1 голос
/ 08 апреля 2019

Некоторые объясняют из C ++ Primer 5th Page 35

Если мы присваиваем значение вне диапазона для объекта беззнакового типа, результатом является остаток от значенияпо модулю количество значений, которое может содержать целевой тип.

Например, 8-разрядный символ без знака может содержать значения от 0 до 255 включительно.Если мы присваиваем значение за пределами диапазона, компилятор назначает остаток этого значения по модулю 256.

unsigned char c = -1; // assuming 8-bit chars, c has value 255

Если мы присваиваем значение вне диапазона для объекта со знаком, то результат не определен,Может показаться, что программа работает, может произойти сбой или могут быть получены значения мусора.

Страница 160: Если какой-либо операнд имеет тип без знака, тип, в который преобразуются операнды, зависит от относительных размеровцелочисленные типы на машине.

... Когда подпись отличается и тип операнда без знака такой же или больше, чем у операнда со знаком, подписанный операнд преобразуется в без знака.

Остается случай, когда подписанный операнд имеет больший тип, чем беззнаковый операнд.В этом случае результат зависит от машины.Если все значения в типе без знака соответствуют большому типу, то беззнаковый операнд преобразуется в тип со знаком.Если значения не соответствуют, тогда операнд со знаком преобразуется в тип без знака.

Например, если операнды имеют тип long и unsigned int, а int и long имеют одинаковый размер, длина будет преобразована в тип unsigned int.Если тип long имеет больше битов, то беззнаковое целое будет преобразовано в long.

Я обнаружил, что чтение этой книги очень полезно.

1 голос
/ 26 февраля 2011

Это так просто:

unsigned int foo;
int bar = 10;

foo = (unsigned int)bar;

Или наоборот ...

0 голосов
/ 27 февраля 2011

Если в одном и том же выражении используются беззнаковые целые и целые (со знаком), то неявное преобразование со знаком автоматически преобразуется в беззнаковое.Это довольно опасная особенность языка Си, и поэтому вам следует об этом знать.Это может или не может быть причиной вашей ошибки.Если вы хотите получить более подробный ответ, вам нужно опубликовать код.

...