Swift 中的 Int 和 Int32 有啥区别?

Posted

技术标签:

【中文标题】Swift 中的 Int 和 Int32 有啥区别?【英文标题】:What is the difference between Int and Int32 in Swift?Swift 中的 Int 和 Int32 有什么区别? 【发布时间】:2015-02-10 22:55:18 【问题描述】:

Core Data 中,您可以存储Int16Int32Int64,但它与Int 不同。它们存在的原因是什么,你是如何使用它们的?

【问题讨论】:

Int 就像 C 的 int:它应该反映原生字长(32 位或 64 位)。但是,Int32(显然)总是 32 位宽。 @TheParamagneticCroissant: C 的int所有 当前的 OS X 和 ios 架构(甚至在 64 位设备上)以及实际上在我所知道的所有当前 Unix 架构上都是 32 位的. Swift 的 Int 就像 Objective-C 的 NSInteger 是 32 位或 64 位。 @MartinR 抱歉,如果我不清楚,但我并不是要在任何地方断言 C 的 int 在 64 位平台上是 64 位的。我要说的是它被设计为用作字大小的整数。大多数现代实现不尊重这种意图的事实是可悲但无关紧要的。当心我评论中的“应该”这个词。我还使用了“like”(而不是“as”),因为我知道它们的实际行为只是相似的,而不是相同的。这只是两种数据类型共享的依赖于平台的整数大小的一般概念,而不是实际的实现细节。 我的应用程序的基本部署目标是 iOS 11,意味着 int == int64。所以实际上我只使用(并且使用)一种类型,即int。我看不出在这里使用 int16 或 int32 的任何理由或好处。 【参考方案1】:

根据Swift Documentation

内部

在大多数情况下,您无需选择要在代码中使用的特定大小的整数。 Swift 提供了一个额外的整数类型 Int,它的大小与当前平台的原生字长相同:

在 32 位平台上,Int 与 Int32 大小相同。

在 64 位平台上,Int 与 Int64 大小相同。

除非您需要使用特定大小的整数,否则请始终在代码中将 Int 用于整数值。这有助于代码一致性和互操作性。即使在 32 位平台上,Int 也可以存储介于 -2,147,483,648 和 2,147,483,647 之间的任何值,并且对于许多整数范围来说足够大。

【讨论】:

感谢您的参考。我被误导性的Int documentation 误入歧途,上面写着:A 64-bit signed integer value type. 却没有提到架构。 当您使用大尺寸数字并且设备为 4/4s 时,使用“Int”会出现问题,因为 iPhone 5 引入了 64 位处理器。我已经很难学会这一点;) FWIW,至少截至今天(2017 年 7 月),Int 文档正确反映了平台差异。 @RohanSanap 我必须纠正你,以防有人在这里依赖此信息:2013 年 iPhone 5S 引入了 64 位。第一款 64 位 iPad支持的是 iPad Air,也是从 2013 年开始的。 @fl034 哎呀。谢谢!不删除我的评论以供读者参考。【参考方案2】:

Swift's Int 是一个包装器,因为它具有与平台容量相同的大小Int32 在 32 位平台上,Int64 在 64 位平台上)。

作为程序员,除非您确实需要,否则不应声明依赖于平台的 Int(例如 Int32、Int64)。例如,当您在 32 位平台上使用无法用 4 个字节表示的数字时,您可以声明 Int64 而不是 Int

Int32:4 字节:从 -2147483648 到 +2147483647 Int64:8 个字节:从 -9223372036854775808 到 +9223372036854775807

【讨论】:

【参考方案3】:

“Int”后面的数字是它使用多少位的参考。当您将 int 用于非常短或几乎不必要的事情时,例如计算列表中有多少对象遵循特定参数时,我通常使用 UInt8,它是一个最大值为 256(2 ^8),并且最小值为 0,因为它是无符号的(这是 UInt8 和 Int8 之间的差异)。如果它是有符号的,(或者变量前面没有“U”),那么它可以是负数。 Int16、Int32 和 Int64 也是如此。使用较小的 Int 类型的好处不是很大,所以如果你不想使用这些,你真的不需要。

【讨论】:

在现代平台上,小于特定大小(通常为 32 位,有时为 64 位)的类型将只使用全部 32 位——因此使用小于此大小的类型最终会浪费空间(例如Int8 将使用 8 位和 24 位填充)。因此,在现代平台上,这样做会过度优化,除非您还将 Int8 用作 SIMD 向量的一部分,或者将 Int8 的数组打包以将它们发送到 GPU,或其他类似的高性能多值计算路径。 (P.S. 当我得知这一点时,我心碎了,我所有仔细的类型调整都是徒劳的。)【参考方案4】:

如果您在配备 32 位或 64 位处理器的笔记本电脑或 iOS 设备上运行,则不会降低性能。只需使用 Int。当你使用 Int8 时,CPU 不只是使用 8 位,无论你使用什么,CPU 都会使用它的整个位宽,因为硬件已经在芯片中......

现在,如果您有一个 8 位 CPU,那么使用 Int32 将需要编译器执行一系列后空翻和魔术技巧以使 32 位 Int 工作

【讨论】:

这不一定是关于性能,而是关于保持语义对处理器/架构变化的不变性。

以上是关于Swift 中的 Int 和 Int32 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Convert.ToInt32 和 (int) 有啥区别?

Convert.ToInt32 和 Int32.Parse 有啥区别? [复制]

C#中Toint16 Toint32 Toint64 有啥区别?

Convert.ToInt16 或 32 或 64 和 Int.Parse 有啥区别? [复制]

C++中int,Uint,uint16等有啥区别以及用处

Int 和 Integer 有啥区别?