C# 转换为int16、int32、int64-如何知道选择哪一个?

C# 转换为int16、int32、int64-如何知道选择哪一个?,c#,integer,typeconverter,C#,Integer,Typeconverter,我经常需要转换一个检索值(通常是字符串),然后将其转换为int。但是在C#(.Net)中,你必须选择int16、int32或int64——当你不知道检索到的数字有多大时,你怎么知道该选择哪一个 如果我们只讨论几个数字,那么选择最大的数字不会对您的总体ram使用产生明显的影响,而且只会起作用。如果你说的是很多数字,你需要对它们使用TryParse()并找出最小的整数类型,以节省内存。所有计算机都是有限的。您需要根据您认为的用户需求定义一个上限 如果您确实没有上限,并且希望允许“无限”值,请尝试将.

我经常需要转换一个检索值(通常是字符串),然后将其转换为int。但是在C#(.Net)中,你必须选择int16、int32或int64——当你不知道检索到的数字有多大时,你怎么知道该选择哪一个

如果我们只讨论几个数字,那么选择最大的数字不会对您的总体ram使用产生明显的影响,而且只会起作用。如果你说的是很多数字,你需要对它们使用TryParse()并找出最小的整数类型,以节省内存。

所有计算机都是有限的。您需要根据您认为的用户需求定义一个上限

如果您确实没有上限,并且希望允许“无限”值,请尝试将.Net Java运行时库添加到您的项目中,这将允许您使用Java.math.biginger类,该类对几乎无限大小的整数进行计算


注意:.NETJava库附带了完整的DevStudio,但我认为它们不附带Express。

只是想添加这一点。。。我记得在.NET 1.1时代,编译器经过了优化,因此'int'运算实际上比byte或short运算快。

我相信它今天仍然有效,但我现在正在进行一些测试



编辑:我有一个惊人的发现:加、减、乘运算实际上返回int

这里所有提到声明Int16存储ram的人都应该投反对票

您的问题的答案是使用关键字“int”(或者如果您喜欢,请使用“Int32”)

这将为您提供多达24亿个数字的范围。。。此外,32位处理器将更好地处理这些整数。。。另外(而且最重要的原因是)如果您计划出于几乎任何原因使用该int。。。它可能需要一个“int”(Int32)

在.Net framework中,99.999%的数字字段(即整数)是“ints”(Int32)

示例:数组.长度,进程.ID,窗口.宽度,按钮.高度等100万次

编辑:我意识到我的脾气会让我失望。。。但这是正确的答案。

反复尝试TryParse()没有意义,您已经声明了一个字段。除非将该字段设置为Object类型,否则无法改变主意。这不是个好主意


该字段表示的任何数据都具有物理意义。这是一个年龄、大小、计数等。物理量对其范围有现实的限制。选择可以存储该范围的int类型。不要试图修复溢出,这将是一个错误。

与当前最流行的答案相反,较短的整数(如Int16和SByte)通常比较大的整数(如Int32和Int64)占用更少的内存空间。通过实例化sbyte/short/int/long的大型数组并使用perfmon测量托管堆大小,可以轻松验证这一点。的确,在对这些整数进行算术运算时,许多CLR风格会扩展这些整数以进行CPU特定的优化,但是当它们作为对象的一部分存储时,它们只占用所需的内存

所以,您肯定应该考虑大小,特别是当您要处理大型整数列表(或包含整数字段的大型对象列表)时。还应该考虑CLS遵从(不允许公共成员中的任何无符号整数)之类的事情。


对于将字符串转换为整数这样的简单情况,我同意Int32(C#int)通常是最有意义的,并且很可能是其他程序员所期望的。

不要忘记,如果不需要负数,C#也有无符号的int(uint32,uint64)。为什么你会否决Int16比Int32占用更少内存的答案?通常是这样,如果需要在内存中存储大量整数数组,这可能是一个重要因素。另外,我真的很喜欢你的脾气,也没有投你的反对票最恼人的事情:Stream.Read和Stream.Write接受'int'偏移量,而Stream.Length很长。。。哼!甚至没有提供分块!因为除非您使用的是20年前的计算机(具有16位RAM)或在内存优化结构中使用压缩存储,否则在堆或堆栈上声明和存储的每个变量都与运行系统和硬件内存大小一致的边界对齐,即在运行32位Windows的32位机器上,即使是一个短值也会有4个字节的存储空间……我还没有验证这一点,但它表示:“短数值(小于4字节的值)在加载时(从内存复制到堆栈)会扩大到4个字节,在存储时(从堆栈复制到内存)会缩小。”