繁体   English   中英

C#0(减号)uint =无符号结果?

[英]C# 0 (minus) uint = unsigned result?

public void Foo(double d){
    // when called below, d == 2^32-1 
    ...
}
public void Bar(){
    uint ui = 1;
    Foo( 0 - ui );
}

我希望0和ui都能在这里升级为签名多头。

是的,使用0字面值,在编译时可以知道转换为uint是安全的,

但我想这一切似乎都错了。 至少应发出警告。

谢谢!

语言规范是否涵盖了这样的半模糊情况?

为什么任何东西都会被推广到long 规范(第7.8.5节)列出了整数减法的四个运算符:

  • int operator-(int x, int y);
  • uint operator-(uint x, uint y);
  • long operator-(long x, long y);
  • ulong operator-(ulong x, ulong y);

假定常量值0可隐式转换为uint ,但uintui 不可隐式转换为int ,则根据7.3.4节中描述的二元运算符重载决策步骤选择第二个运算符。

(您是否可能不知道从0uint的隐式常量表达式转换,这是令人困惑的部分?有关详细信息,请参阅C#4规范的第6.1.9节。)

在7.3.4节(后面引用7.3.5和7.5.3)之后略有曲折,但我相信它的定义很明确,而且根本不含糊。

如果这是困扰你的溢出,那么期望也会失败吗?

int x = 10;
int y = int.MaxValue - 5;
int z = x + y;

如果没有,这里的真正区别是什么?

它是被转换为uint以从0执行减法的int (由编译器隐式解释为uint )。 请注意, intuint是隐式转换,因此没有警告。 您的代码没有任何问题......除了uint不是CLS编译器。 你可以在这里阅读原因。 有关MSDN上CLS编译代码的更多信息

在已检查的上下文中,如果差异超出结果类型的范围,则抛出System.OverflowException。 在未经检查的上下文中,不报告溢出,并且丢弃结果类型范围之外的任何重要高位。

http://msdn.microsoft.com/en-us/library/aa691376(v=vs.71).aspx

从技术上讲,执行以下操作:

double d = checked(0-ui);

将导致抛出System.OverflowException ,这可能是您所期望的,但根据规范,因为未检查溢出不会报告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM