Как отличить или преобразовать unsigned int в int в C?
Извиняюсь, если вопрос кажется странным. Я отлаживаю свой код, и это, похоже, проблема, но я не уверен.
Спасибо!
Ответы
Ответ 1
Это зависит от того, кем вы хотите, чтобы поведение было. int
не может содержать многие значения, которые может иметь unsigned int
.
Вы можете использовать как обычно:
int signedInt = (int) myUnsigned;
но это вызовет проблемы, если значение unsigned
прошло через max int
. Это означает, что половина возможных значений unsigned
приведет к ошибочному поведению, если вы специально не следите за ним.
Вероятно, вам следует пересмотреть, как вы храните значения в первую очередь, если вам нужно преобразовать без уважительной причины.
EDIT: Как упоминалось в комментариях ProdigySim, максимальное значение зависит от платформы. Но вы можете получить к нему доступ с помощью INT_MAX
и UINT_MAX
.
Для обычных 4-байтовых типов:
4 bytes = (4*8) bits = 32 bits
Если используются все 32 бита, как в unsigned
, максимальное значение будет равно 2 ^ 32 - 1 или 4,294,967,295
.
A, подписанный int
, эффективно жертвует одним битом для знака, поэтому максимальное значение будет 2 ^ 31 - 1 или 2,147,483,647
. Обратите внимание, что это половина другого значения.
Ответ 2
Unsigned int может быть преобразован в подписанный (или наоборот) простым выражением, как показано ниже:
unsigned int z;
int y=5;
z= (unsigned int)y;
Хотя это не касается вопроса, вы хотели бы прочитать следующие ссылки:
Ответ 3
Если у вас есть переменная unsigned int x;
, вы можете преобразовать ее в int
с помощью (int)x
.
Ответ 4
Это так просто:
unsigned int foo;
int bar = 10;
foo = (unsigned int)bar;
Или наоборот...
Ответ 5
Некоторые объясняют из С++ 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 имеет больше битов, то беззнаковое int будет преобразовано в long.
Я обнаружил, что чтение этой книги очень полезно.
Ответ 6
Если в одном выражении используются беззнаковые int и a (signed) int, подписанный int неявно преобразуется в unsigned. Это довольно опасная особенность языка C, и поэтому вам нужно быть в курсе. Это может быть или не быть причиной вашей ошибки. Если вы хотите получить более подробный ответ, вам придется опубликовать код.