整数列表的正值总和变为负值?

时间:2016-01-18 09:28:15

标签: c#

我有一个整数列表,其中我存储了一个图像的RGB值,但是在以整数存储值之和后,它变为负数,而数组中的所有值都是正数,这是代码!

        Bitmap bi = new Bitmap(@"E:\Store Signature Data\01\01_1.bmp");
        bi = ResizeImage(bi, 20, 20);

        Color[,] imgary = new Color[bi.Width, bi.Height];


        for (int x = 0; x < bi.Width; x++)
        {
            for (int y = 0; y < bi.Height; y++)
            {
                imgary[x, y] = bi.GetPixel(x, y);
            }
        }

        List<int> RGB = new List<int>();
        int c = 0;
        //RGB value= Red + (Green*256) + (Blue*256*256)
        for (int i = 0; i <20; i++)
        {
            for (int a = 0; a < 20; a++)
            {
                c++;
                Console.WriteLine(imgary[i,a]+"  "+c);
                Color Pixels = imgary[i, a];
                int Red = Pixels.R;
                int Blue = Pixels.B;
                int Green = Pixels.G;
                 RGB.Add(Red + (Green * 256) + (Blue * 256 * 256));

            }
        }


        int total = 0;
        for (int i = 0; i < RGB.Count; i++)
        {
            total += Math.Abs(RGB[i]);
        }
        Math.Abs(total);
        Console.WriteLine(total);

enter image description here

2 个答案:

答案 0 :(得分:1)

您在列表中插入20 * 20 = 400 RGB个值。所以,让我们说每个人都是蓝色的。您将添加400次0xFF0000。结果总和为0x18FFFFE70,但(32位)int可以将0x7FFFFFFF作为最大值。第一位(0x80000000)表示值的符号。

由于你的总和溢出了int(通过使用它的第一位),结果总和可能是负数。

如果您知道不会超过400个值,请考虑使用Int64

答案 1 :(得分:0)

您的int似乎被分配了一个高于C#(2,147,483,647)中可接受的最大值的值,这会使其溢出为负值。

检查这些问题 - 它们可能有用:

No overflow exception for int in C#?

Best way to handle Integer overflow in C#?