1

我想将 C# 中的一个非常大的负数转换为正值,但我知道 Math.Abs​​ 在你点击Decimal.MaxValue. 我知道这个数字非常大,但是通过我的网络传来的数据可能具有这个值或更大的可能性很小。我想知道是否可以在 C# 中翻转数字的符号位。

这是我现在的代码:

int bucket = Math.Abs(sdmpobject.SnapshotHandle.GetHashCode()) % numPartitions;

这个用途Math.Abs(),我只是想知道是否有可能只翻转符号位?

4

4 回答 4

3

GetHashCode()总是返回一个 32 位整数 ( int)。这没有办法超过Decimal.MaxValue
我假设GetHashCode()在这里使用是实际错误。

于 2013-04-09T12:20:23.280 回答
2

GetHashCode()将返回一个int,而不是一个Decimal

Math.Abs(int)int只有当传递等于时才会失败int.MinValue,所以你可以明确地测试那个条件:

int myValue = sdmpobject.SnapshotHandle.GetHashCode();
int absValue = myValue == int.MinValue ? int.MaxValue : Math.Abs(myValue);
int bucket = absValue % numPartitions;

这假设您可以接受因这种罕见的情况而离开一个人。由于您的结果位于一个名为“bucket”的变量中,因此您可能希望像这样逐个更正该变量:

int myValue = sdmpobject.SnapshotHandle.GetHashCode();
int bucket;
if (myValue == int.MinValue)
{
    bucket = ((int.MaxValue % numPartitions) + 1) % numPartitions;
}
else
{
    int bucket = Math.Abs(myValue) % numPartitions;
}

您不能只为所有值“翻转符号”的原因是,带符号的数据类型通常可以比正数多容纳一个负数,因此它们不能代表它们可以容纳的最大负数的绝对值。

于 2013-04-09T12:21:43.103 回答
0

这不是Abs失败,而是超出了值的数值范围。

因此,您可能需要采用另一种数字类型以避免出现问题 - 来自网络的原始数字是什么类型/范围?

于 2013-04-09T12:20:36.270 回答
0

在您提到的问题中,decimal但您给出的示例是 with int

还:

这使用 Math.Abs​​(),我只是想知道是否可以只翻转符号位?

是的,有一种方法,但你不想只翻转符号位,因为这不会给你倒数(即翻转 -1 上的符号位不会导致 1)

于 2013-04-09T12:21:39.983 回答