2016-02-12 26 views
5

birisi bana nasılC Kapalı dönüşüm mü?

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

baskılar dışarı açıklayabilir '-1'. Bir çeşit örtülü dönüşüm olduğunu varsayar ama anlayamıyorum. unsigned integerunsigned integer

+7

Tüm uyarıları etkinleştir: * "C4308 uyarısı: negatif tümleşik sabit, işaretsiz türüne dönüştürülür" * sorunu açıklar. –

+1

Şimdi bu kodun neden ifşa ettiğini açıklayın (if ((-2 <2u? 1u: -1)> 0) {printf ("- 1> 0"); } 'baskı '-1> 0' :) – Lundin

+0

@Lundin [This] gibi bir şey demek istiyorsun (http://pastebin.com/raw/Ss7pW8hb)? – Michi

cevap

5

-2 dönüştürülüyor. Bu kesinlikle 2'dan daha büyük olan UINT_MAX - 1'a eşit olacaktır. Bu nedenle, koşul başarısız olur ve -1 yazdırılır.

+0

Yani '-2' ve 'işaretsiz tamsayı' dönüşüyor? – Nebeski

+3

@Nebeski Hayır, -2 ile "unsigned int" dönüşümü, başlıkta belirtildiği gibi örtük bir dönüşümdür. İmzalı ve imzasız bir miktarı doğrudan karşılaştıramazsınız, böylece biri diğerine dönüştürülür. – unwind

+0

@Nebeski "tamsayı promosyonları" ve "olağan aritmetik dönüşümler" konusunu inceleyin. – Lundin