Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换为int类型会产生一个负数_C#_Casting - Fatal编程技术网

C# 转换为int类型会产生一个负数

C# 转换为int类型会产生一个负数,c#,casting,C#,Casting,我在设置文件流中的位置时遇到了一个奇怪的错误:“需要非负数。参数名称:value” 从长远来看,索引的值为8388608,并且正如预期的那样(索引*256)=2147483648,但是当我将其转换为int时,得到的是相同的数字,只有负数。(-2,147,483,648). 为什么会发生这种情况 目标框架是.NET4,应用程序是为“任何CPU”构建的 背景 如果有人想知道这段代码的用途,它是我编写的一个类的一部分,该类模拟字符串数组,但不将值存储在内存中。MappedStringArray类允许我

我在设置文件流中的位置时遇到了一个奇怪的错误:“需要非负数。参数名称:value”

从长远来看,索引的值为8388608,并且正如预期的那样(索引*256)=2147483648,但是当我将其转换为int时,得到的是相同的数字,只有负数。(-2,147,483,648). 为什么会发生这种情况

目标框架是.NET4,应用程序是为“任何CPU”构建的

背景


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

因为2147483648是十六进制x80000000。就int32而言,这是一个负数

这是一个整数溢出。2147483648的值不能用
int
表示,其最大正值为2^31-1=2147483647。(这是因为
int
在C#中是一个4字节=32位的值,并且因为它是一个有符号的int,所以第一位表示符号,实际数字保留31位)

您可以看到2147483648正好比这多1,因此
int
将溢出,将第一位设置为
1
,表示负号,其余为零,因此,您将收到
int

的最大负数int是有符号值。 在代码中使用ULONG而不是INT

 mem.Position = (Ulong)(index * 256); 

这里,PM100的某些上下文会有帮助,因为我猜OP不知道什么是<代码> X800 000 < /代码>,或者为什么<代码> It32/<代码>会认为溢出是否定的。似乎是最好的答案,为什么溢出会以这种方式工作,并触及OP的原始问题的细节。谢谢。显然position属性很长,所以我进行了类型转换,因为不需要它。不过,很高兴知道这种情况会发生,以供将来参考。我认为如果超过了最大大小,那么尝试类型转换将抛出错误。如果你问我,把它变成负数有点傻。我是说,如果我在计算呢?这真的会让事情变得棘手,但这是必须在计算机上发生的事情。“转向最大负数”与数据的固定格式有关(
int
=
int32
=1个符号位,31个数据位),以及通过两个符号位的互补来表示负值和正值。您可以在@JoshuaDannemann处读取该值。您可以在项目属性中启用checked算术,这将使它对
未选中的
块中未发生的所有溢出抛出异常。@Kyle太棒了!向前看,我一定会在我所有的项目上检查这个选项!
 mem.Position = (Ulong)(index * 256);