【问题标题】:Converting to int16, int32, int64 - how do you know which one to choose?转换为 int16、int32、int64 - 你怎么知道该选择哪一个?
【发布时间】:2010-09-21 04:19:09
【问题描述】:

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

【问题讨论】:

  • 别忘了,如果你不需要负数,c#也有无符号整数(uint32,uint64)。

标签: c# integer typeconverter


【解决方案1】:

这里提到声明 Int16 保存 ram 的每个人都应该投反对票。

您的问题的答案是使用关键字“int”(或者如果您愿意,可以使用“Int32”)。

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

在 .Net 框架中,99.999% 的数字字段(即整数)是“整数”(Int32)。

示例:Array.Length、Process.ID、Windows.Width、Button.Height 等 100 万次。

编辑:我意识到我的脾气暴躁会让我投票失败……但这是正确的答案。

【讨论】:

  • 为什么你会否决指出 Int16 占用的 RAM 比 Int32 少的答案?它通常会这样做,如果您需要在内存中存储大量整数数组,这可能是一个重要因素。 PS。我真的很喜欢你的脾气暴躁,并没有反对你。 :)
  • 最烦人的事情:Stream.Read 和 Stream.Write 接受 'int' 偏移量,而 Stream.Length 很长......呃!甚至没有提供分块!
  • 因为除非您使用 20 年的旧计算机(具有 16 位 RAM)或在内存优化结构中使用压缩存储,
  • 在堆或栈上声明和存储的每个变量都与操作系统和硬件内存大小一致的边界对齐字节存储...
  • 我还没有验证这一点,但csharphelp.com/archives2/archive299.html 声明:“短数值(小于 4 字节的值)在加载(从内存复制到堆栈)时会扩大到 4 字节并缩小存储时(从堆栈复制到内存)。”
【解决方案2】:

只是想补充一点...我记得在 .NET 1.1 时代,编译器经过优化,因此 'int' 操作实际上比字节或短操作更快。

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


编辑:我有一个惊喜发现:short(s) 的加法、减法和乘法运算实际上返回 int!

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      因此,您绝对应该考虑大小,特别是如果您将使用大型整数列表(或使用包含整数字段的大型对象列表)。您还应该考虑诸如 CLS 合规性(不允许公共成员中存在任何无符号整数)之类的问题。

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          如果您确实没有上限并且想要允许“无限”值,请尝试将 .Net Java 运行时库添加到您的项目中,这将允许您使用 java.math.BigInteger 类 - 它几乎可以进行数学运算- 无限大小的整数。

          注意:.Net Java 库带有完整的 DevStudio,但我不认为它们带有 Express。

          【讨论】:

            猜你喜欢
            • 2014-02-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-14
            • 1970-01-01
            • 1970-01-01
            • 2022-08-04
            • 1970-01-01
            相关资源
            最近更新 更多