Int 和 Integer 有啥区别?
Posted
技术标签:
【中文标题】Int 和 Integer 有啥区别?【英文标题】:What is the difference between Int and Integer?Int 和 Integer 有什么区别? 【发布时间】:2011-03-26 15:36:32 【问题描述】:在 Haskell 中,Int
和 Integer
有什么区别?答案记录在哪里?
【问题讨论】:
【参考方案1】:Int 是机器整数的类型, 至少有保证范围 -229 到 229 - 1,而 Integer 是任意精度整数,具有 范围与您的内存一样大。
https://mail.haskell.org/pipermail/haskell-cafe/2005-May/009906.html
【讨论】:
【参考方案2】:“整数”是任意精度 类型:它将保存任何数字 不管多大,到极限 你机器的内存……这意味着你从来没有 算术溢出。在另一 手这也意味着你的算术是 比较慢。 Lisp 用户可以 在这里识别“bignum”类型。
“Int”是更常见的 32 位或 64 位 整数。实现方式不同, 虽然它保证在 至少 30 位。
来源:The Haskell Wikibook。此外,您可能会发现 Haskell 简介 中的 Numbers 部分很有用。
【讨论】:
根据this answer,使用Integer
通常比is快
@Maarten,这只是因为Int64
在 32 位系统上的实现相当糟糕。在 64 位系统上,这很棒。【参考方案3】:
Int 是 C 的 int,表示它的取值范围是 -2147483647 到 2147483647, 而整个 Z 集合中的 Integer 范围,这意味着它可以任意大。
$ ghci
Prelude> (12345678901234567890 :: Integer, 12345678901234567890 :: Int)
(12345678901234567890,-350287150)
注意 Int 字面量的值。
【讨论】:
GHCi,版本 7.10.3 给出警告:文字 12345678901234567890 超出 Int 范围 -9223372036854775808..9223372036854775807【参考方案4】:前奏只定义了最 基本数字类型:固定大小 整数 (Int),任意精度 整数(整数),...
...
有限精度整数类型 Int 至少涵盖范围 [ - 2^29, 2^29 - 1]。
来自 Haskell 报告:http://www.haskell.org/onlinereport/basic.html#numbers
【讨论】:
【参考方案5】:Int
是Bounded
,这意味着您可以使用minBound
和maxBound
找出限制,这些限制取决于实现但保证至少保持[-229 sup> .. 229-1].
例如:
Prelude> (minBound, maxBound) :: (Int, Int)
(-9223372036854775808,9223372036854775807)
但是,Integer
是任意精度,而不是 Bounded
。
Prelude> (minBound, maxBound) :: (Integer, Integer)
<interactive>:3:2:
No instance for (Bounded Integer) arising from a use of `minBound'
Possible fix: add an instance declaration for (Bounded Integer)
In the expression: minBound
In the expression: (minBound, maxBound) :: (Integer, Integer)
In an equation for `it':
it = (minBound, maxBound) :: (Integer, Integer)
【讨论】:
【参考方案6】:Integer
被实现为Int#
,直到它大于Int#
可以存储的最大值。那时,它是一个GMP 号码。
【讨论】:
这听起来是特定于实现的。是否有参考说 Integer 需要以这种方式实现? 不,你是对的,这是特定于 GHC 的。也就是说,1. GHC 是大多数人使用的,2. 这是我能想到的实现这种数据类型的最智能的方式。 这是否意味着(在 GHC 中)使用Integer
没有性能折衷,因此Integer
总是更好的选择?以上是关于Int 和 Integer 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章