C++ et C# sont des langages différents. Ils ont des règles différentes pour gérer la promotion de type en cas de comparaisons.
En C++ et C, ils sont généralement comparés comme s'ils étaient tous deux non signés. Cela s'appelle "unsigned preserving". Les compilateurs C++ et C utilisent traditionnellement la "préservation non signée" et son utilisation est spécifiée dans la norme C++ et dans K&R.
En C#, ils sont tous deux convertis en longs signés, puis comparés. C'est ce qu'on appelle la "préservation de la valeur". Le C# spécifie la préservation de la valeur.
L'ANSI C spécifie également la préservation des valeurs, mais uniquement lorsqu'il s'agit de courts et de caractères. Les shorts et les chars (signés et non signés) sont convertis en ints de manière à préserver la valeur, puis comparés. Ainsi, si un short non signé était comparé à un short signé, le résultat serait semblable à l'exemple du C#. Chaque fois qu'une conversion vers une taille supérieure est effectuée, elle est réalisée en préservant la valeur, mais si les deux variables sont de la même taille (et non des shorts ou des chars) et que l'une ou l'autre est non signée, elles sont comparées comme des quantités non signées en ANSI C. Il existe une bonne discussion sur les avantages et les inconvénients des deux approches. dans la FAQ comp.lang.c .