我有两个变量。
int x = 1;
uint y = 2;
类型必须保持int
和uint
。但我不能用它们进行基本的算术运算。
y += x;
无法将类型'int'隐式转换为'uint'。显式转换 存在(你是否错过演员表?)
所以我每次都必须这样做?
if (x < 0)
{
y -= (uint)Math.Abs(x);
}
else
{
y += (uint)x;
}
来自C / C ++ / Java背景,这让我感到困惑 这里有什么我想念的吗?
为什么这种行为与提到的其他语言不同?
还有更好的选择吗?
我认为这是该语言新手的常见之旅 不,我不依赖于下溢。
答案 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);