2013-08-06 40 views
12

看一看这个C代码:INT推广在C unsigned int类型和C#

int main() 
{ 
    unsigned int y = 10; 
    int x = -2; 
    if (x > y) 
     printf("x is greater"); 
    else 
     printf("y is greater"); 
    return 0; 
} 
/*Output: x is greater.*/ 

我明白为什么输出x是更大,因为当计算机比较他们两个,x被晋升为一个无符号整数类型。 当x被提升为无符号整数时,-2变成65534,肯定大于10.

但是为什么在C#中,等效代码是否会给出相反的结果呢?

public static void Main(String[] args) 
{ 
    uint y = 10; 
    int x = -2; 
    if (x > y) 
    { 
     Console.WriteLine("x is greater"); 
    } 
    else 
    { 
     Console.WriteLine("y is greater"); 
    } 
} 
//Output: y is greater. 
+11

因为C#比较好? :D – lukegravitt

+1

我今天刚学到了一些关于C的新东西。我必须承认我不喜欢它。编译器是否至少会发出警告? –

+2

[unsigned int(C++)vs uint(c#)]可能的重复(http://stackoverflow.com/questions/8266089/unsigned-int-c-vs-uint-c) – lukegravitt

回答

19

在C#中,既uintint比较之前得到提升到long

这是记录在C#语言规范的4.1.5 Integral types

对于二元+, - ,*,/,%,&,^,|,= =,=,>,<,! > =和< =运算符,操作数转换为T类型,其中T是int,uint,long和ulong中的第一个,它们可以完全表示两个操作数的所有可能值。然后使用类型T的精度执行操作,结果的类型是T(或关系运算符为bool)。不允许一个操作数是long类型,另一个操作数是二元运算符类型的ulong。

由于long是一个可以完全代表所有intuint值第一类型,变量都被变换为long,然后进行比较。

0

C和C#有什么整型表示不同意见。关于C的观点,请参阅我的回答https://stackoverflow.com/a/18796084/363751。在C#中,整数是表示数字还是抽象代数环的成员在某种程度上由“checked arithmetic”打开还是关闭决定,但是它只是控制超出边界的计算是否应该抛出异常。一般而言,.NET框架将所有整数类型视为表示数​​字,并且除了允许执行一些外部边界计算而不会抛出异常外,C#还会继续发挥其作用。

如果无符号类型表示代数环的成员, -5到无符号2应该产生一个无符号的值,当加到5时,它将产生2.如果它们代表数字,那么如果可能的话,将-5加到无符号2应该产生-3的表示。由于将操作数提升为Int64将允许发生这种情况,这就是C#所做的事情。顺便说一下,我不喜欢操作符(特别是关系操作符!)应该总是通过将它们的操作数提升为一个通用兼容类型来工作的观​​点,应该返回该类型的结果,并且应该接受,而不用大声疾呼任何能够组合操作符的组合被提升为普通类型。鉴于float f; long l;,存在用于比较f==l [它可以投l浮动,它可以投lfdouble,或者它可以确保f是可以转换为long的整数,并且,至少有三个显含义当投的时候等于l]。或者,编译器可以简单地拒绝这种混合比较。如果我通过druthers的话,编译器将被禁止将操作数投向关系运算符,除非只有一个合理的含义。要求在所有地方都可以隐式转换的东西必须是直接可比的,恕我直言,这是无益的。

相关问题