Haskell整数大小

Haskell整数大小,haskell,Haskell,Haskell中Int(有界整数)的大小是多少,还是GHC中的Int 作为练习,我编写了一个简短的程序来获取整数中设置的位数 import Data.Bits getBits :: Int -> Int getBits x | x == 0 = 0 | otherwise = 1 + (getBits y) where y = x .&. (x - 1) main = do putStrLn "type a integer" num &

Haskell中Int(有界整数)的大小是多少,还是GHC中的Int

作为练习,我编写了一个简短的程序来获取整数中设置的位数

import Data.Bits

getBits :: Int -> Int
getBits x
    | x == 0 = 0
    | otherwise = 1 + (getBits y)
    where y = x .&. (x - 1)


main = do
    putStrLn "type a integer"
    num <- getLine
    let n = read num :: Int
    putStrLn $ "result is: " ++ show (getBits n)
导入数据.位
getBits::Int->Int
getBits x
|x==0=0
|否则=1+(gety位)
其中y=x。(x-1)
main=do
putStrLn“键入一个整数”
numInt类型为:

固定精度的整数类型,其范围至少为[-2^29。。 2^29-1]. 可以确定给定实现的精确范围 通过使用有界类中的minBound和maxBound

摘自Haskell文档

对于8位整数,可以使用Int8;对于32位整数,可以使用Int32;对于64位整数,可以使用Int64

回答为什么在Haskell中这样做:不像C和C++,Haskell默认实现“box”,甚至原始类型。这对于许多惊人的多态性特性(尽管,更令人惊讶的是,内联通常可以让您摆脱大部分的开销)以及懒散性都是必要的。因此,即使是
Bool
也至少占用通用指针的内存:AMD64平台上的64位!听起来可能非常浪费,但很少有问题:在处理过程中,所有数据都加载到几个寄存器中,这些寄存器无论如何都是如此之大,对于存储,您始终可以使用更高效的“打包”容器。无论如何,这意味着在64位体系结构上,使用32位数据的类型与使用64位数据的类型进行计算没有任何优势。但很明显,在很多情况下,额外的比特会派上用场;当您知道您将需要它们时,您始终可以明确要求
Int64
。但是当你在32位平台上工作时,从实际意义上讲,这是非常昂贵的,因为那里的内存也会更紧


通常,当可能出现大数字但不是真正典型的数字时,只使用“本机”类型更有效,但检查
maxBound
以避免溢出。

前面的回答没有回答“Int的大小是多少”的问题,而是提供了查找极值的方法

提供
bitSizeMaybe
finiteBitSize
以查找类型的位大小。它们取代同一模块中的
位大小

finiteBitSize :: b -> Int
返回参数类型中的位数。实际的 参数的值被忽略

用法示例:

> import Data.Bits
> finiteBitSize (42 :: Int)
64

在C和C++中,int并不总是32位。使用上面32位GHC上的函数产生“32”。
> import Data.Bits
> finiteBitSize (42 :: Int)
64