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