【问题标题】:What is the difference between int, Int16, Int32 and Int64?int、Int16、Int32 和 Int64 有什么区别?
【发布时间】:2012-03-14 05:55:29
【问题描述】:

intSystem.Int16System.Int32System.Int64 除了尺寸有什么区别?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    每种类型的整数都有不同的存储容量范围

       Type      Capacity
    
       Int16 -- (-32,768 to +32,767)
    
       Int32 -- (-2,147,483,648 to +2,147,483,647)
    
       Int64 -- (-9,223,372,036,854,775,808 to +9,223,372,036,854,775,807)
    

    正如 James Sutherland 在his answer 中所说:

    intInt32 确实是同义词; int 会多一点 看起来很熟悉,Int32 使 32 位对那些人来说更加明确 阅读您的代码。我倾向于在我需要的地方使用 int '一个整数', Int32 大小很重要(密码, 结构),因此未来的维护者会知道扩大 int 如果合适,但应注意更改 Int32 变量 以同样的方式。

    生成的代码将是相同的:差异纯粹是其中之一 可读性或代码外观。

    【讨论】:

    • 如果您知道该值不会超过 65,535(有符号)或 -32,768 到 32,767(无符号),将整数定义为 int16 以节省内存资源不是更好吗,而不是简单地使用int?
    • int 和 int32 可以是同义词,但它们不必是同义词。如今,大多数出售的系统都是 64 位的,在这种情况下,int 将是 64 位。
    • 对于 Matthew T. Baker 和像我这样的其他人,他们来到这里试图从性能的角度决定使用哪个,您应该查看这篇文章,该帖子表明 Integer 在许多情况下比 Int16 更有效: stackoverflow.com/questions/129023/net-integer-vs-int16
    • @MartijnOtto 这个问题被标记为 C#。在 C# 中,int总是Int32,与系统无关。也许您正在考虑 C++?
    • @MattBaker:一般来说,在现代计算机上,int16 占用的空间与 int32(实际上是 int64)一样多,因为为了使大多数操作高效,我们会填充数据以使访问对齐到 32 或 64 位边界(分别在 32 或 64 位模式下)。这是因为未对齐的访问在某些架构上效率极低,而在其他架构上则不可能。
    【解决方案2】:

    这里唯一真正的区别是大小。这里所有的 int 类型都是有符号的整数值,具有不同的大小

    • Int16:2 个字节
    • Int32int:4 个字节
    • Int64 : 8 个字节

    Int64 和其他的有一点不同。在 32 位平台上,Int64 存储位置的分配不能保证是原子的。对于所有其他类型,它都得到保证。

    【讨论】:

    • 如果我在32 bit Windows Operating System 中使用Int64,那么我可能面临哪些问题?有例子吗?
    【解决方案3】:

    int

    它是 C# 中定义的原始数据类型。

    映射到FCL类型的Int32。

    它是一个值类型,代表 System.Int32 结构。

    它是有符号的,占用 32 位。

    它的最小值为 -2147483648,最大值为 +2147483647。

    Int16

    是整箱类型。

    在 C# 中,short 映射到 Int16。

    它是一个值类型,代表 System.Int16 结构。

    它是有符号的,占用 16 位。

    它的最小值为 -32768,最大值为 +32767。

    Int32

    是整箱类型。

    在 C# 中,int 映射到 Int32。

    它是一个值类型,代表 System.Int32 结构。

    它是有符号的,占用 32 位。

    它的最小值为 -2147483648,最大值为 +2147483647。

    Int64

    是整箱类型。

    在 C# 中,long 映射到 Int64。

    它是一个值类型,代表 System.Int64 结构。

    它是有符号的,占用 64 位。

    它的最小值为 –9,223,372,036,854,775,808,最大值为 9,223,372,036,854,775,807。

    【讨论】:

    • 只是补充一点,Int64 数据类型可以使用 Ll 后缀表示,而 Int16Int32 在 C# 中没有后缀。
    【解决方案4】:

    根据 Jeffrey Richter(.NET 框架开发的贡献者之一)的书“CLR via C#”:

    int 是 C# 编译器允许的原始类型,而 Int32 是框架类库类型(适用于遵守 CLS 的语言)。实际上,int 在编译过程中会转换为 Int32。

    还有,

    在 C# 中,long 映射到 System.Int64,但在不同的编程中 语言,long 可以映射到 Int16 或 Int32。事实上,C++/CLI 确实 处理长 Int32。

    事实上,大多数 (.NET) 语言甚至不会将 long 视为关键字,也不会 编译使用它的代码。

    我见过这位作者,以及许多关于 .NET 的标准文献,他们更喜欢 FCL 类型(即 Int32)而不是特定于语言的原始类型(即 int),主要是关于此类互操作性问题。

    【讨论】:

      【解决方案5】:

      编辑:这对于 C# 来说并不完全正确,我在回答这个问题时错过了一个标签 - 如果有更具体的 C# 答案,请改为投票!


      它们都代表不同大小的整数。

      但是,有一个非常非常小的差异。

      int16、int32 和 int64 都有一个固定大小。

      int 的大小取决于您正在编译的架构 - C 规范仅将 int 定义为大于或等于 short,尽管实际上它是您所针对的处理器的宽度,即 可能 32位,但你应该知道它可能不是。

      【讨论】:

      • 这应该是公认的答案,因为这是唯一真正正确的答案
      • 不,这不适用于 C#。 C# int 的大小始终为 32 位。对于 C,是的,您必须处理这种复杂性,并且您经常在 C 代码中看到宏来处理可变 int 大小。请参阅ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf 第 18 页。
      • @Ananke Ahh,错过了 C# 标签。希望我可以恢复对答案的一些投票.....
      【解决方案6】:

      什么都没有。类型之间的唯一区别 是它们的大小(以及它们可以表示的值的范围)。

      【讨论】:

        【解决方案7】:

        关于 16、32 和 64 类型的一个非常重要的说明:

        如果您运行此查询... Array.IndexOf(new Int16[]{1,2,3}, 1)

        您应该得到零(0),因为您要问...在 1、2 或 3 的数组中是 1。 如果您得到 -1 作为答案,则表示 1 不在 1、2 或 3 的数组中。

        看看我发现了什么: 以下所有内容都应该给你 0 而不是 -1 (我已经在所有框架版本 2.0、3.0、3.5、4.0 中对此进行了测试)

        C#:

        Array.IndexOf(new Int16[]{1,2,3}, 1) = -1 (not correct)
        Array.IndexOf(new Int32[]{1,2,3}, 1) = 0 (correct)
        Array.IndexOf(new Int64[]{1,2,3}, 1) = 0 (correct)
        

        VB.NET:

        Array.IndexOf(new Int16(){1,2,3}, 1) = -1 (not correct)
        Array.IndexOf(new Int32(){1,2,3}, 1) = 0 (correct)
        Array.IndexOf(new Int64(){1,2,3}, 1) = -1 (not correct)
        

        所以我的意思是,对于 Array.IndexOf 比较,只信任 Int32!

        【讨论】:

        • 为了澄清为什么第一个例子是这样工作的:第一个字面量 1、2 和 3 被隐式转换为 short 以适应数组,而第二个字面量 1 被留下作为一个普通的int(int)1 不等于(short)1(short)2(short)3,因此结果为-1。
        • C# 版本也有类似的调整,但仅供参考,一个简单的类型说明符修复了这个问题:Array.IndexOf(new Int16(){1,2,3}, 1S)Array.IndexOf(new Int32(){1,2,3}, 1I)Array.IndexOf(new Int64(){1,2,3}, 1L) 一切正常。
        • 而那些不起作用的已经使用了Object[],Object 重载。 C# 在需要时将int 隐式提升为long(并且还将short 提升为intlong),但不会隐式降低,而是使用object 重载。使用Option Strict OnOff VB 将仅在提供统一类型时使用类型化重载,否则使用object 重载。
        • 您的回答具有误导性。该代码正在比较不同类型的值。结论for Array.IndexOf comparisons, only trust Int32! 是错误的。如果您将最终的 1 参数转换为相应的 Array 类型,它会按预期工作。
        • 这是一个非常有趣且出乎意料的行为(因为 int 对 long 有效,而 short 对 int 没有)因此赞成!
        【解决方案8】:
        1. intint32 是一回事(32 位整数)
        2. int16 是短整型(2 字节或 16 位)
        3. int64 是长数据类型(8 字节或 64 位)

        【讨论】:

        • int 不保证为 32 位。
        • @mjs,这根本不是真的。在 C# 中,intInt32 的别名,因此始终保证为 32 位。
        • 其实mjs说的是对的,INT表示基于系统x86或者x64的整数,所以如果你的系统是x64,int就是Int64,所以不保证是32..如果你把x64 中的 int32 将始终为 int32。
        • 不,David Arno 所说的是正确的。 C# 语言专门将“int”定义为 32 位整数 (Int32)。其他语言(C/C++ 等)可能未指定,但此问题标记为“C#”。
        • @TheoBrinkman 正确,这是微软关于 C#s 整数类型的页面:docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
        【解决方案9】:

        它们告诉整数变量可以存储什么大小。要记住大小,您可以考虑 :-) 2 beer(2 bytes)、4 beer(4 bytes) 或 8 beer(8 bytes)。

        • Int16 :-2 啤酒/字节 = 16 位 = 2^16 = 65536 = 65536/2 = -32768 到 32767

        • Int32 :- 4 啤酒/字节 = 32 位 = 2^32 = 4294967296 = 4294967296/2 = -2147483648 到 2147483647

        • Int64 :- 8 啤酒/字节 = 64 位 = 2^64 = 18446744073709551616 = 18446744073709551616 /2 = -9223372036854775808 到 9223372036854775807

        简而言之,您可以在 int16 中存储超过 32767 个值,超过 int32 中的 2147483647 值和超过 9223372036854775807 中的值 int64。

        要了解上述计算,您可以观看此视频int16 vs int32 vs int64

        【讨论】:

          【解决方案10】:

          它们确实是同义词,但是我发现它们之间的区别很小,

          1)创建enum时不能使用Int32

          enum Test : Int32
          { XXX = 1   // gives you compilation error
          }
          
          enum Test : int
          { XXX = 1   // Works fine
          }
          

          2) Int32 属于系统声明。如果你删除using.System,你会得到编译错误,但int不会出现

          【讨论】:

            【解决方案11】:

            以上人的回答基本正确。 int, int16, int32 ...根据它们的数据保存能力而有所不同。但这就是编译器必须处理这些问题的原因——这是为了解决潜在的 2038 年问题。查看链接以了解更多信息。 https://en.wikipedia.org/wiki/Year_2038_problem

            【讨论】:

            • 感谢您的回答。但是编译器必须处理不同的 int 大小的原因与 2038 年问题无关。编译器只是按照给定的方式编译。 2038 年的解决方案确实是使用更大的 int 大小,但既没有因此发明 64 位整数,也没有解决 32 位硬件上的问题。
            • 是的,该问题的解决方案是使用更大的 int 大小。编译器绝不允许存储不适合指定 int16 或 int32 类型的大日期。我们开发人员也会清楚,int32 只能存储 -2,147,483,648 到 2,147,483,647。如果我们需要存储未来的时间戳,我们使用 unsigned int32
            【解决方案12】:

            Int=Int32 --> 原来的long类型

            Int16 --> 原始 int

            Int64 --> 新数据类型在 64 位系统后可用

            "int" 仅用于向后兼容。我们应该真正使用新的 int 类型来使我们的程序更精确。

            ---------------

            还有一件事我注意到没有类似于 Int16、Int32 和 Int64 的名为 Int 的类。所有有用的函数,如TryParse 整数都来自Int32.TryParse

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-10-04
              • 2014-02-24
              • 2015-02-10
              • 1970-01-01
              • 2011-01-19
              • 2022-12-12
              • 1970-01-01
              • 2018-02-24
              相关资源
              最近更新 更多