Int和Integer有什么区别?

时间:2010-08-07 05:52:22

标签: haskell numbers integer int bignum

在Haskell中,IntInteger之间有什么区别?答案记录在哪里?

7 个答案:

答案 0 :(得分:165)

  

“整数”是一个任意精度   类型:它将保留任何数字号   无论多大,达到极限   你机器的记忆....这意味着你永远不会拥有   算术溢出。在另一   手也意味着你的算术   比较慢。 Lisp用户可能会   在这里认识到“bignum”类型。

     

“Int”是更常见的32位或64位   整数。实施方式各不相同   虽然它保证在   至少30位。

来源:The Haskell Wikibook。此外,您可能会发现 A Hntleell简介Numbers部分很有用。

答案 1 :(得分:19)

  

Int 是机器整数的类型,   保证范围至少   -2 29 至2 29 - 1,而 Integer 是任意精度整数,   范围与你有记忆力一样大。

https://mail.haskell.org/pipermail/haskell-cafe/2005-May/009906.html

答案 2 :(得分:18)

IntBounded,这意味着您可以使用minBoundmaxBound来查找限制,这些限制取决于实现,但保证至少保留[ -2 29 .. 2 29 -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)

答案 3 :(得分:11)

Int是C int,表示其值范围为-2147483647到2147483647, 而整数 Z 集的整数范围,也就是说,它可以任意大。

$ ghci
Prelude> (12345678901234567890 :: Integer, 12345678901234567890 :: Int)
(12345678901234567890,-350287150)

注意Int文字的值。

答案 4 :(得分:5)

  

Prelude仅定义最多   基本数字类型:固定大小   整数(Int),任意精度   整数(整数),...

...

  

有限精度整数类型Int   涵盖至少范围[ - 2 ^ 29,   2 ^ 29 - 1]。

来自Haskell报告的

http://www.haskell.org/onlinereport/basic.html#numbers

答案 5 :(得分:4)

Integer被实现为Int#,直到它变得大于Int#可以存储的最大值。那时,它是一个GMP号。

答案 6 :(得分:0)

整数允许进行更积极的优化,因为它不受溢出所导致的不确定行为的限制。

即,编译器必须假设所编写的表达式永远不会出现未定义的行为,并且编译器引入的任何潜在优化也不会引入新的未定义的行为。

或其他方式

表达式a - (b - c)在代数上等效于(a + c) - b,但是编译器无法进行这种重新排列,因为中间值a + c可能会因输入溢出而不会引起溢出原来的。