Преобразование C Short в Int

Мне дали код, который выглядит так:

unsigned int x = 0xDEADBEEF;
unsigned short y = 0xFFFF;
if (x > (signed short) y)
    printf("Hello");

Однако неверно, что x > y, когда y приводится к короткому со знаком (а затем неявно преобразуется в unsigned int при сравнении), принимает значение MAX_UINT. Почему это происходит? y расширяет знак, или что еще может вызвать такое странное поведение?


person Will    schedule 05.03.2013    source источник


Ответы (1)


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

person Jens Gustedt    schedule 05.03.2013
comment
О, хорошо. Имеет смысл. Спасибо! - person Will; 05.03.2013
comment
...is implementation defined - а? Разве 6.3.1.8 (Обычные арифметические преобразования) стандарта C не определяет, что происходит, когда разные знаки и значения не подходят? - person Mike; 05.03.2013
comment
@Mike Нет, 6.3.1.8 предназначен для поиска общего вещественного типа, когда операнды двоичной операции имеют разные типы. Здесь соответствующий параграф 6.3.1.3§3. - person Virgile; 05.03.2013