转换为int类型会产生负数

Jos*_*ann -1 c# casting

在FileStream中设置位置时遇到了一个奇怪的错误:"需要非负数.参数名称:值".

public string this[Int64 index]
{
    get
    {
        Byte n = Convert.ToByte(0);
        Byte[] Buffer = new Byte[255];
        mem.Position = (int)(index * 256); //Error occurs here
        mem.Read(Buffer, 0, Buffer.Length);
        Buffer = (from b in Buffer where b != n select b).ToArray();
        return System.Text.Encoding.Default.GetString(Buffer);
    }
    set
    {
        mem.Position = (int)(index * 256);
        value += String.Concat(Enumerable.Repeat("\0", 255 - value.Length));
        Byte[] Buffer = System.Text.Encoding.Default.GetBytes(value + "|");
        mem.Write(Buffer, 0, Buffer.Length);
    }
}
Run Code Online (Sandbox Code Playgroud)

作为一个长期,索引的值为8,388,608并且如预期的那样(索引*256)= 2,147,483,648,但是当我将其转换为int时,我得到相同的数字,只有负数.(2,147,483,648).为什么会这样?

目标框架是.NET 4,应用程序是为"任何CPU"构建的.

背景

如果有人想知道这段代码的用途,那么它是我写的一个模仿字符串数组的类的一部分,但是没有将值存储在内存中.MappedStringArray类允许我处理几乎任何大小的文件,而不会达到RAM的限制,因为它只知道文件中行的位置并根据需要读出它们.

Max*_*rdt 6

这是一个整数溢出.2,147,483,648的值不能用a表示int,其最大值为 正值为2 ^ 31-1 = 2,147,483,647.(这又是因为a int是C#中的4字节= 32位值,并且因为它是带符号的int,所以第一位表示符号,实际数字留下31位).

您可以看到2,147,483,648正好比其他1个,因此int会溢出,将第一位设置为1表示负号,其余为零,因此,您将收到可能的最大负数int.

  • 但它有**会在计算机上发生."转向最负数"与数据的固定格式有关(`int` =`int32` = 1符号位,31个数据位)以及两个恭维的负值和正值的表示.您可以在https://en.wikipedia.org/wiki/Two's_complement#Most_negative_number上阅读. (5认同)
  • @JoshuaDannemann你可以在项目属性中启用已检查的算术,这将使它在所有未在`unchecked`块内发生的溢出上抛出异常. (2认同)