unsigned int (c++) vs uint (c#)
Folgenden ist der c# - code:
static void Main(string[] args)
{
uint y = 12;
int x = -2;
if (x > y)
Console.WriteLine("x is greater");
else
Console.WriteLine("y is greater");
}
und diese ist c++ - code:
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int y = 12;
int x = -2;
if(x>y)
printf("x is greater");
else
printf("y is greater");
return 0;
}
Beide geben unterschiedliche Ergebnis. Übersehe ich etwas grundlegendes? Irgendeine Idee?
- mögliche Duplikate von Signed/unsigned-Vergleiche
- Allgemeiner Tipp: Immer sicherstellen, dass beide Werte vom gleichen Typ für einen Vergleich
- Diese Frage ist etwa, warum signed/unsigned-Vergleiche in C++ verursachen eine compiler-Warnung, wenn Sie den operator ist <, >, >=, oder <=, aber nicht, wenn der operator ==. Das ist eine ganz andere Frage, und seine Antwort hat sehr wenig Einfluss auf die Antwort auf diese ein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
C++ und C# sind Sprachen. Sie haben unterschiedliche Regeln für den Umgang mit Typ-Förderung im Falle der Vergleiche.
In C++ und C, Sie sind in der Regel gegenüber, als wären Sie beide unsigniert. Dies wird als "unsigned bewahren". C++ und C-Compiler verwenden traditionell "unsigned Erhaltung" und die Nutzung dieser ist angegeben in der C++ - standard und in K&R.
In C#, Sie sind beide in signed longs und dann verglichen. Dies wird als "werterhaltende". C# gibt Wert bewahren.
ANSI C legt auch Wert bewahren, aber nur wenn man sich mit shorts und chars. Shorts und chars (signed und unsigned) sind upconverted, um int-Werte in einen Wert-erhaltende Art und Weise und dann verglichen. Wenn also ein unsigned short wurden im Vergleich zu einem signierten kurz, das Ergebnis herauskommen würde, wie das C# - Beispiel. Jeder Zeit eine Umstellung auf eine größere Größe ist getan, es ist getan, in eine Wert-Erhaltung der Art und Weise, aber wenn die beiden Variablen die gleiche Größe (und keine shorts oder chars) und entweder man ist unsigned, dann bekommen Sie im Vergleich als nicht signierte Mengen in ANSI-C. Es gibt eine gute Diskussion der up-und down-Seiten der beiden Ansätze in der comp.lang.c FAQ.
int
undunsigned int
beteiligt ist, werden beide Operanden umgewandelt werden würde, umunsigned int
.int
zuunsigned int
in diesem Fall. Das ist, welche durch eine formale standard, da eine vorzeichenlose zu halten, kann ein größerer Wert als ein intIn C++, wenn Sie vergleichen eine
unsigned int
und einsigned int
, diesigned int
umgewandeltunsigned int
. Umwandlung einer negativensigned int
zu einemunsigned int
erfolgt durch hinzufügenUINT_MAX + 1
, die größer ist als12
und damit das Ergebnis.In C#, wenn Sie immer das Gegenteil, dann bedeutet es, dass in C# die beiden Ausdrücke werden in
signed int
signed long
(long
oderSystem.Int64
)1 und dann verglichen.In C++ mit dem compiler muss Euch gegeben haben, die Warnung:
Regel:
Nehmen Sie immer Warnungen ausgestoßen, indem der compiler ernst!!!
1, Wie zu Recht darauf hingewiesen, von svick in die Kommentare.
long
oderSystem.Int64
).Ich weiß nicht, über den standard von C#, aber in den C++ standard
usual arithmetic conversions
würde angewendet werden, um die beiden Operanden der relationalen Operatoren:So, wenn
unsigned int
ist im Vergleich mitint
,int
umgewandelt werden würde, umunsigned int
, und-2
würde sich eine sehr große Zahl, wenn umgewandeltunsigned int
.