【问题标题】:Why can't I subtract an int from a uint? [duplicate]为什么我不能从 uint 中减去一个 int? [复制]
【发布时间】:2016-07-19 07:08:36
【问题描述】:

我有两个变量。

int x = 1;
uint y = 2;

类型必须保持为intuint。但是我不能用它们进行基本的算术运算。

y += x;

无法将类型“int”隐式转换为“uint”。显式转换 存在(您是否缺少演员表?)

所以我每次都必须做这样的事情?

if (x < 0)
{
    y -= (uint)Math.Abs(x);
}
else
{
    y += (uint)x;
}

来自 C/C++/Java 背景,这让我很困惑。
我在这里缺少什么吗?

为什么这种行为与提到的其他语言不同?
有更好的选择吗?

我认为这是该语言新手的常见问题。
不,我不依赖下溢。

【问题讨论】:

  • 要执行y += x,必须执行从intuint 的转换。因为这种转换是有损的,编译器需要你显式地执行它。

标签: c# types int type-conversion uint


【解决方案1】:

无法保证int 将适合uint,这就是您收到编译器错误的原因。

如果您真的想执行该操作(也就是说,如果您知道数字适合),您可以像以前一样进行投射或使用Convert 方法。

if (x < 0)
{
    y -= Convert.ToUint32(Math.Abs(x));
}
else
{
    y += Convert.ToUint32(x);
}

如果你不确定这些数字是否合适,你可以把它们夹起来:

uint result = Math.Max(uint.MinValue(Math.Min(uint.MaxValue, x))

此外,在某些情况下,您可以使用 unchecked 上下文。这不会给您错误,但会溢出大于可能适合的值。

最后,如果要在它们的可能值范围之间进行映射,请使用int.MaxValue 作为偏移量:

uint x = someuint();
int y = Convert.ToInt32(x - int.MaxValue);

int w = someint();
uint z = Convert.ToUint32(w + int.MaxValue);

【讨论】:

  • 我不能使用 int 因为它可能是负数或导致下溢,但我可以使用另一个 uint 和 case 下溢吗?它们是 System.Int32 和 System.UInt32。那不是说它们的尺寸是一样的吗?
  • 它们的位大小相同,但它们代表的数值不同。例如,您不能将 -1 表示为 Uint32。但是,如果您想要的只是它们之间的 map,那么您可以通过添加或减去 int.MaxValue 来应用“移位”,它跨越了任一可表示范围的一半。
猜你喜欢
  • 1970-01-01
  • 2010-09-05
  • 2013-01-15
  • 1970-01-01
  • 2012-04-20
  • 2012-02-05
  • 2012-05-16
相关资源
最近更新 更多