2014-04-17 8 views

Antwort

13

Sie die int als unsigned deklariert. Es wird immer> = 0 sein. Der einzige Grund, warum Sie negative Werte sehen, ist, dass Ihr printf-Aufruf es als signiert (% d) interpretiert, anstatt unsigniert (% ud).

+0

aber printf gibt einen negativen Wert – bricklore

+0

@ MalteSchmitz Nicht in C# –

+0

@DrC ah sh * t vergaß das Ding mit dem '% ud' .. :) danke – bricklore

2

Ein unsigned int kann niemals negativ werden.

+0

aber printf gibt einen negativen Wert aus – bricklore

+0

@MalteSchmitz Das liegt daran, dass du% d verwendest, was für Ganzzahlen ist,% u ist für vorzeichenlose Intervers. – PomfCaster

2

In C# Dieser Code

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

Erzeugt folgende Ausgabe:

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

Sie sind ein unsigned int verwenden. Es kann niemals < 0 sein. Es wird nur umgebrochen. Sie sehen negative Werte aufgrund der Art und Weise, wie Sie Ihre Ausgabe formatieren (interpretieren sie als ein vorzeichenbehaftetes int).

2

Schleife bricht, wenn i kleiner als Null wäre. Aber i ist unsigniert, und es ist nie weniger als null.

+0

printf konvertiert i von unsigned int nach int und zeigt signed –

+0

printf mit% d an, so dass vorzeichenbehaftete ganze Zahlen gedruckt wurden – Balu

0

im for-Schleife

für (unsigned int i = 50; i> = 0; i--) printf ("i =% d \ n", i);

der Wert von i decresed von 1, und wenn Ihr Wert i==0 dann versuchen Schleife Abnahme i-- bedeutet i=-1

Die zuweisen -1 rechts von Ihrem Gleichheitszeichen als 'Signed Integer eingerichtet ist (wahrscheinlich 32 Bits groß) und haben den hexadezimalen Wert 0xFFFFFFF4. Der Compiler generiert Code zum Verschieben dieser vorzeichenbehafteten Ganzzahl in Ihre vorzeichenlose Ganzzahl i, die ebenfalls eine 32-Bit-Entität ist. Der Compiler nimmt an, dass Sie nur einen positiven Wert rechts vom Gleichheitszeichen haben, also verschiebt es einfach alle 32 Bits in i. i hat jetzt den Wert 0xFFFFFFF4, der 4294967284 ist, wenn er als eine positive Zahl interpretiert wird. Aber das printf-Format von% d besagt, dass die 32 Bits als eine vorzeichenbehaftete Ganzzahl interpretiert werden müssen, so dass Sie -1 erhalten. Wenn Sie% verwendet hatten u hätte es als 4294967284. gedruckt

3

Obwohl Sie nicht nach einer Lösung gefragt haben, hier sind zwei gemeinsame Wege zur Behebung des Problems:

// 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 :) sie scheinen ein bisschen wie böser hacks – bricklore

+0

Zur besseren Lesbarkeit schlage ich vor, 'i -> 0' zu ändern 'i--> 0'. Es ist ein bisschen wie das Schreiben von "a ------ b", was funktioniert, aber es ist Absicht ist nicht klar ('(a--) - (- (--b))'). – Caramiriel

+0

@Caramiriel 'a ------ b' wird tatsächlich als' (((a -) -) -) b' geparst, was keinen Sinn ergibt. – fredoverflow