2014-04-17 14 views

Trả lời

13

Bạn tuyên bố int như unsigned. Nó sẽ luôn luôn là> = 0. Lý do duy nhất bạn thấy giá trị âm là lệnh printf của bạn diễn giải nó như đã ký (% d) thay vì unsigned (% ud).

+0

nhưng printf kết quả đầu ra một giá trị âm – bricklore

+0

@ MalteSchmitz Không phải trong C# –

+0

@DrC ah sh * t quên điều đó với '% ud' .. :) nhờ – bricklore

2

An unsigned int không bao giờ có thể trở thành tiêu cực.

+0

nhưng printf xuất ra giá trị âm – bricklore

+0

@MalteSchmitz Đó là vì bạn đang sử dụng% d cho số nguyên,% u là dành cho người liên kết chưa ký. – PomfCaster

2

Trong C# mã này

for (uint i = 50; i >= 0; i--) 
    Console.WriteLine(i); 

sản xuất sau đầu ra:

50 
... 
7 
6 
5 
4 
3 
2 
1 
0 
4294967295 
4294967294 
4294967293 
... 

Bạn đang sử dụng một unsigned int. Nó không bao giờ có thể là < 0. Nó chỉ quấn quanh. Bạn đang thấy các giá trị âm vì cách bạn định dạng đầu ra của mình (diễn giải nó dưới dạng int đã ký).

2

Ngắt vòng khi i sẽ nhỏ hơn 0. Nhưng i chưa được ký và không bao giờ nhỏ hơn 0.

+0

printf chuyển đổi i từ unsigned int thành int, và hiển thị chữ ký –

+0

printf được cung cấp với% d thatswhy nó ​​in số nguyên đã ký – Balu

0

tại của bạn cho vòng lặp

for (int i = 50; i> = 0; i--) printf ("i =% d \ n", i);

giá trị của i decresed bởi 1 và khi giá trị của bạn của i==0 sau đó lặp sụt lần cố gắng để gán i-- nghĩa i=-1

Các -1 bên phải bình đẳng của bạn đăng được thiết lập như một số nguyên ký (có thể là 32 bit về kích thước) và sẽ có giá trị thập lục phân 0xFFFFFFF4. Trình biên dịch tạo ra mã để di chuyển số nguyên đã ký này vào số nguyên không dấu của bạn i cũng là một thực thể 32 bit. Trình biên dịch giả sử bạn chỉ có một giá trị dương ở bên phải dấu bằng để nó đơn giản di chuyển tất cả 32 bit thành i. i hiện có giá trị 0xFFFFFFF4 là 4294967284 nếu được hiểu là số dương. Nhưng định dạng printf của% d cho biết 32 bit sẽ được hiểu là số nguyên đã ký để bạn nhận -1. Nếu bạn đã sử dụng% u nó sẽ in như 4294967284.

3

Mặc dù bạn đã không yêu cầu một giải pháp, sau đây là hai cách phổ biến của sửa chữa các vấn đề:

// 1. The goes-to operator 
for (unsigned int i = 51; i --> 0;) 
    printf("i = %d\n", i); 

// 2. Waiting for overflow 
for (unsigned int i = 50; i <= 50; i--) 
    printf("i = %d\n", i); 
+0

soul soul :) chúng có vẻ giống như hack ác – bricklore

+0

Để dễ đọc, tôi đề nghị thay đổi 'i -> 0' thành 'i--> 0'. Nó giống như viết 'a ------ b', hoạt động nhưng ý định của nó không rõ ràng ('(a--) - (- (- b))'). – Caramiriel

+0

@Caramiriel 'a ------ b' thực sự được phân tích cú pháp là' (((a -) -) -) b' không có ý nghĩa gì cả. – fredoverflow