为什么我不能从uint中减去一个int?

时间:2016-03-31 02:26:45

标签: c# types int type-conversion uint

我有两个变量。

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背景,这让我感到困惑 这里有什么我想念的吗?

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

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

1 个答案:

答案 0 :(得分:2)

无法保证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);