在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);
}
}
作为一个长期,索引的值为8,388,608,并且如预期的那样(索引* 256)= 2,147,483,648,但是当我将其转换为int时,我得到相同的数字,只有负数。 (2,147,483,648)。为什么会这样?
目标框架是.NET 4,应用程序是为“任何CPU”构建的。
背景
如果有人想知道这段代码的用途,它是我编写的模仿字符串数组的类的一部分,但没有将值存储在内存中。 MappedStringArray类允许我处理几乎任何大小的文件而不会达到RAM的限制,因为它只知道文件中行的位置并根据需要读出它们。
答案 0 :(得分:6)
这是一个整数溢出。 2,147,483,648的值不能用int
表示,其最大值为{1}。正值为2 ^ 31-1 = 2,147,483,647。 (这又是因为int
是C#中的4字节= 32位值,并且因为它是带符号的int,所以第一位表示符号,为实际数字留下31位。 / p>
你可以看到2,147,483,648正好是1,因此int
将溢出,将第一位设置为1
,表示负号,其余为零,并且为这样,您将获得int
可能的最大负数。
答案 1 :(得分:-2)
因为2,147,483,648是十六进制x80000000。就int32而言,这是一个负数
答案 2 :(得分:-2)
INT是签名值。 在代码中使用ULONG而不是INT。
mem.Position = (Ulong)(index * 256);