2016-02-12 17 views
5

Ai đó có thể giải thích cho tôi cách thứcC chuyển đổi ngầm?

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

in '-1'. Tôi cho rằng có một số loại chuyển đổi tiềm ẩn đang diễn ra nhưng dường như tôi không thể hiểu được.

+7

Bật tất cả cảnh báo: * "cảnh báo C4308: hằng số tích phân âm được chuyển thành loại không dấu" * giải thích sự cố. –

+1

Bây giờ giải thích tại sao mã này 'if ((-2 <2u? 1u: -1)> 0) {printf (" - 1> 0 "); } 'in' -1> 0' :) – Lundin

+0

@Lundin Bạn có ý nghĩa giống như [This] (http://pastebin.com/raw/Ss7pW8hb)? – Michi

Trả lời

5

-2 đang được chuyển đổi thành unsigned integer. Số tiền này sẽ bằng UINT_MAX - 1, số tiền này chắc chắn lớn hơn 2. Do đó, điều kiện không thành công và -1 được in.

+0

Vì vậy, 'u' có chuyển đổi cả hai -2 và 2 thành' số nguyên không dấu'? – Nebeski

+3

@Nebeski Không, chuyển đổi từ -2 thành 'unsigned int' là một chuyển đổi ẩn, như được đề cập trong tiêu đề. Bạn không thể so sánh số lượng đã ký và số lượng chưa ký trực tiếp, vì vậy, một số được chuyển đổi sang số khác. – unwind

+0

@Nebeski Nghiên cứu "quảng cáo số nguyên" và "chuyển đổi số học thông thường". – Lundin

Các vấn đề liên quan