Какое приведение происходит при несовпадении со знаком или без знака? - PullRequest
4 голосов
/ 08 мая 2009

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

Ответы [ 3 ]

3 голосов
/ 08 мая 2009

Если операнд является целым числом и имеется значение без знака, то выполняется преобразование в беззнаковое значение. Например:

-1 > (unsigned int)1 // as -1 will be converted to 2^nbits-1

Преобразование int-> unsigned int: n> = 0 -> n; n <0 -> n (mod 2 ^ nbits), например -1 переходит в 2 ^ nbits-1

Преобразование без знака int-> int: n <= INT_MAX -> n; n> INT_MAX -> реализация определена

Если тип назначения не подписан, результирующее значение является наименьшим целое число без знака, конгруэнтное исходное целое число (по модулю 2 ^ n, где n количество битов, используемых для представления тип без знака).

Если тип назначения подписан, значение не изменяется, если оно может быть представлены в типе назначения (и ширина битового поля); в противном случае значение определяется реализацией.

1 голос
/ 08 мая 2009

Я не думаю, что C ++ отличается от способа, которым C обрабатывает преобразования со знаком / без знака:

Правила конвертации более сложные когда задействованы unsigned операнды. Проблема в том, что сравнения между знаковыми и неподписанными значениями зависит от машины, потому что они зависят по размерам различного целого типы. (К & К)

Одним из важных факторов, который следует учитывать, является то, является ли один из типов целым числом long, потому что это повлияет на целочисленные продвижения. Например, если long int сравнивается с unsigned int, а long int может представлять все значения unsigned int, то unsigned int будет преобразовано в long int. (В противном случае они оба просто конвертируются в unsigned long int.)

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

0 голосов
/ 08 мая 2009

Может зависеть от компилятора. Если вы посмотрите на вопрос « Должен ли я отключить предупреждение о несоответствии со знаком / без знака в компиляторе C? », вы увидите, что в случае переменной «litb» переменная со знаком подписывается в «значение без знака».

В любом случае нет «правильного» способа для компилятора справиться с этой ситуацией, когда одна переменная достигает определенного значения (то есть, когда установлен старший значащий бит ). Так что, если у вас есть такое предупреждение, обязательно избавьтесь от него;)

...