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
中,您可以存储Int16
、Int32
、Int64
,但它与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 和 Int32.Parse 有啥区别? [复制]
C#中Toint16 Toint32 Toint64 有啥区别?