在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的限制,因为它只知道文件中行的位置并根据需要读出它们.
这是一个整数溢出.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.