2014-04-17 6 views

Odpowiedz

13

zadeklarowanej jako unsigned int. Zawsze będzie> = 0. Jedynym powodem, dla którego widzisz wartości ujemne, jest to, że twoje polecenie printf interpretuje je jako podpisane (% d) zamiast niepodpisane (% ud).

+0

ale printf wyprowadza wartość ujemną – bricklore

+0

@ MalteSchmitz Nie w C# –

+0

@DrC ah sh * t zapomniałem tego z '% ud' .. :) dzięki – bricklore

2

An unsigned int nie może nigdy stać się ujemnym.

+0

ale printf wyświetla ujemną wartość – bricklore

+0

@MalteSchmitz To dlatego, że używasz% d, który jest dla liczb całkowitych,% u jest dla niepodpisanych intergerów. – PomfCaster

2

W języku C# ten kod

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

Produkuje następujące dane wyjściowe:

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

Używasz unsigned int. Nigdy nie może być < 0. Po prostu się zawija. Wyświetlane są ujemne wartości ze względu na sposób formatowania danych wyjściowych (interpretując je jako podpisane int).

2

Pętla zerwana, gdy i będzie mniejsza niż zero. Ale i jest bez znaku i nigdy nie jest mniejsze niż zero.

+0

printf konwertuje i od unsigned int do int, i wyświetla podpisany –

+0

printf dostarczany z% d thatsdlaczego wydrukował liczby całkowite – Balu

0

W twojej do pętli

dla (unsigned int i = 50; i> = 0; ja--) printf ("I =% d \ n" l);

wartość i decresed przez 1 a gdy wartość i==0 następnie pętla ubytek próby przypisania i-- oznacza i=-1

-1 po prawej swoimi znak równości jest ustawiona jako liczba całkowita ze znakiem (prawdopodobnie 32 bity) i będą miały szesnastkową wartość 0xFFFFFFF4. Kompilator generuje kod, aby przenieść tę podpisaną liczbę całkowitą do niepodpisanej liczby całkowitej i, która jest również encją 32-bitową. Kompilator zakłada, że ​​masz tylko dodatnią wartość po prawej stronie znaku równości, więc po prostu przenosi wszystkie 32 bity do i. i ma teraz wartość 0xFFFFFFF4, która wynosi 4294967284, jeśli zostanie zinterpretowana jako liczba dodatnia. Ale format printf% d mówi, że 32 bity mają być interpretowane jako liczba całkowita ze znakiem, więc otrzymasz -1. Jeśli użył% u byłoby drukowane jako 4294967284.

3

Mimo, że nie poprosić o rozwiązanie, tu są dwa sposoby mocowania problemu:

// 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

nice soultions :) wydają się trochę jak złe hacki – bricklore

+0

Dla czytelności sugeruję zmianę 'i -> 0' na 'i--> 0'. To trochę tak, jak pisanie 'a ------ b', które działa, ale jest zamierzone, nie jest jasne (' (a--) - (- (- b)). – Caramiriel

+0

@Caramiriel 'a ------ b' jest w rzeczywistości analizowany jako' (((((a -) -) -) b' który nie ma sensu. – fredoverflow