C# 当在C中强制转换基值类型是必要的时

C# 当在C中强制转换基值类型是必要的时,c#,casting,mono,double,C#,Casting,Mono,Double,我有一个关于使用数学运算时在基值类型之间转换的一般问题。Microsoft C规范中是否有任何书面规则?我找不到他们。它在单声道中的工作原理相同吗 例如: double a = 1 / 1234; //Result is 0 double b = 1.0 / 1234; //Result is 0,000810372771474878 double c = 1.0 / (double)1234; //Res

我有一个关于使用数学运算时在基值类型之间转换的一般问题。Microsoft C规范中是否有任何书面规则?我找不到他们。它在单声道中的工作原理相同吗

例如:

double a = 1 / 1234;                    //Result is 0
double b = 1.0 / 1234;                  //Result is 0,000810372771474878
double c = 1.0 / (double)1234;          //Result is 0,000810372771474878
double d = (double)1 / (double)1234;    //Result is 0,000810372771474878
double e = 1 / 1234.0;                  //Result is 0,000810372771474878
当除数或除数是双倍的时候,我能假设结果总是双倍的吗? 或者出于某种原因,确保两者都是双重的更好吗?参见案例d——我已经看到许多这样的代码,它们实际上让我提出了这个问题

问候,,
塞巴斯蒂安

当你把两个整数除时,你会得到一个整数结果。由于int不能保存00008103771474878,因此结果将被截断为0,然后将0 int转换为double,结果为0.0

要获得浮点结果,其中一个操作数应为浮点类型。在这种情况下,整数操作数将转换为双精度/浮点或十进制,具体取决于数字的类型


长话短说中有关于除法运算符的详细信息,是的,当二进制操作的至少一侧被键入时,可以安全地假定编译器将假定为double。虽然从可读性的角度来看,它有时可能是有用的,但实际上并不相关,但值得一提

我要说的是,虽然我不认为你在最初的问题中把这个弄糊涂了,但是你给结果赋值的变量类型对除法运算符重载的确定没有影响

您的top case只是利用了一个隐式转换,它将具有与此显式等效的功能

double a = (double)(1 / 1234);
您将其分配给double的事实并不影响1/1234的计算结果(如您所发现的)为0的事实,因为该转换是在除法的事后进行的。如果我们在这里在时空中挖一个洞,这个例子将落在这篇文章底部列表的最后一个例子,其中两个整数被除。因此,根据规范第7.8.2节,这将返回商的下限,或0

这种行为在C5规范的第7.3.6节中有描述。我承认,我花了一点时间,重点是我的

7.3.6数字促销

当重载解析规则§7.5.3应用于这组运算符时,效果是从操作数类型中选择存在隐式转换的第一个运算符。例如,对于操作b*s,其中b是字节,s是短的,重载解析选择运算符*int,int作为最佳运算符。因此,结果是b和s被转换为int,结果的类型是int。同样,对于操作i*d,其中i是int,d是double,重载解析选择操作符*double,double作为最佳操作符

当然,这不仅适用于乘法,正如其示例所示,还适用于任何二进制操作

为了更好地衡量,层次结构如下,取自7.3.6.2,重点仍然是我的

•如果任一操作数的类型为decimal,则另一个操作数将转换为decimal类型,或者如果另一个操作数的类型为float或double,则会发生绑定时间错误。 •否则,如果任一操作数为double类型,则另一个操作数将转换为double类型。 •否则,如果任一操作数为浮点型,则另一个操作数将转换为浮点型。 •否则,如果任一操作数的类型为ulong,则另一个操作数将转换为ulong类型,或者如果另一个操作数的类型为sbyte、short、int或long,则会发生绑定时间错误。 •否则,如果任一操作数的类型为long,则另一个操作数将转换为long类型。 •否则,如果任一操作数的类型为uint,而另一个操作数的类型为sbyte、short或int,则两个操作数都将转换为long类型。 •否则,如果任一操作数为uint类型,则另一个操作数将转换为uint类型。 •否则,两个操作数都转换为int类型

实际上,编译器实际上是通过将非双精度操作数转换为double类型来为您执行转换的