2016-02-12 10 views
5

Может кто-нибудь объяснить мне, какC неявное преобразование?

printf("%d", -2<2u?1:-1); 

распечатывает '-1'. Я предполагаю, что происходит какое-то неявное преобразование, но я не могу понять его.

+7

Включить все предупреждения: * «предупреждение C4308: отрицательная интегральная константа, преобразованная в неподписанный тип» * объясняет проблему. –

+1

Теперь объясните, почему этот код 'if ((-2 <2u? 1u: -1)> 0) {printf (" - 1> 0 "); } 'prints' -1> 0' :) – Lundin

+0

@ Lundin Вы имеете в виду что-то вроде [This] (http://pastebin.com/raw/Ss7pW8hb)? – Michi

ответ

5

-2 преобразуется в unsigned integer. Это будет равно UINT_MAX - 1, что определенно превышает 2. Следовательно, условие терпит неудачу и печатается -1.

+0

Так что 'u' преобразует как -2, так и 2 в' unsigned integer'? – Nebeski

+3

@Nebeski Нет, преобразование -2 в 'unsigned int' является неявным преобразованием, как указано в заголовке. Вы не можете напрямую сравнивать подписанное и неподписанное количество, поэтому одно преобразуется в другое. – unwind

+0

@Nebeski Изучите «целые акции» и «обычные арифметические преобразования». – Lundin