签名的int数组类型C#

时间:2012-10-02 14:53:13

标签: c# arrays casting int signed

当我运行以下代码时:

public int[] finalResult = new int[dimension];
public float[] calculatedValue = new float[dimension];
.....
.....
finalResult[i] = (int) Math.Floor(calculatedValue[i]);
Console.WriteLine( "calculated:" + calculatedValue[i] 
    +  " final:" + finalResult[i] 
    + "  test: " +(int) Math.Floor(calculatedValue[i]));

输出结果为:

  

计算:-0.02043936 final:0 test:-1

为什么“final”与完全相同的代码生成的“test”不同?哪一个错了,为什么?

更简单,更小的片段

finalResult[i]=(int)Math.Floor(-3.0002);
Console.WriteLine( "final: "+ finalResult[i]+ " test:" +(int)Math.Floor(-3.0002));

输出 决赛:0测试:-4

其余代码无效,如下所示 我最后尝试了以下内容,

public int[] junkArray = new int[dimension];
junkArray[i]=(int)Math.Floor(-3.0002);  //Junk Array is only assigned here in whole code
Console.WriteLine( "final: "+ (int) junkArray[i]+ " test:" +(int)Math.Floor(-3.0002));

我得到最终输出:0测试:-4

3 个答案:

答案 0 :(得分:3)

这是我认为实际发生的事情。请记住,我在这里做出假设,因为你提供的代码没有编译,当我尝试调整它时,我总能得到我期望的正确结果。因此,我试图通过犯下故意的错误来考虑如何产生你得到的结果:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        private static int dimension = 1;
        public static int[] junkArray = new int[dimension];

        static void Main(string[] args)
        {
            Method1();
            Method2();
        }

        static void Method1()
        {
            int i = 0;
            junkArray[i] = (int)Math.Floor(-3.0002);
        }

        static void Method2()
        {
            int i = 0;
            int[] junkArray = new int[dimension];
            Console.WriteLine("final: " + (int)junkArray[i] + " test:" + (int)Math.Floor(-3.0002));
        }
    }
}

这会产生您看到的结果:

最终:0测试:-4

我将代码拆分为两种方法,一种方法是执行“计算”,另一种方法执行“演示”。但是,出于某种原因(缺少咖啡因,无论如何),我的第二种方法也声明了一个隐藏/遮蔽包含我们的计算结果的字段的数组变量。这不是非法的,但这意味着当我从我的Console.WriteLine方法调用junkArray中读取时,我正在从不同的 junkArray中读到我之前写的结果。

这可能不是正在发生的事情,但这是一种可能性,如果没有看到您的实际代码,这是我能提供的最佳猜测。看看并确保您正在读取的数组肯定您将结果写入的相同数组,而不是第二个“遮蔽”第一个数组的数组。

答案 1 :(得分:2)

如果我测试代码

var final = new int[1];
var calc = new[] { -0.02043936f };
final[0] = (int)Math.Floor(calc[0]);

Console.WriteLine(
    "calc:{0} final:{1} test:{2}",
    calc[0],
    final[0],
    (int)Math.Floor(calc[0]));

毫无疑问我得到了输出

  

calc:-0.02043936 final:-1 test:-1

所以,你的代码还有其他问题。

答案 2 :(得分:0)

这里发生了两件事

首先 - -0.02043936是计算值

现在你正在应用math.floor。它将做的是,它将使值下降并返回一个双倍,这将是一个非常小的数字。

现在您将它转换为整数。这样做,因为它更接近于零,它将把它变为零。

要证明这一点,请计算出值-0.62043936之类的东西,根据您的期望得到-1