2014-03-11 4 views
1

Каков размер Int (ограниченное целое число) в Haskell, или я должен сказать в GHC?Haskell Int size

В практике я написал короткую программу, чтобы получить число битов, установленных в 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) 

Если я номер входа -1, результат равен 64, что указывает на размер в Int составляет 64 бит , Почему это так? Почему это не 32 бит, как в C/C++?

+3

Почему это должно быть? – Squidly

+7

Инты не всегда 32 бита в C и C++. – mipadi

ответ

12

Тип Int является:

Фиксированный точности целочисленный тип по крайней мере, в диапазоне [-2^29 .. 2^29-1]. Точный диапазон для данной реализации может быть определен с использованием minBound и maxBound из класса Bounded.

взято из документации Haskell.

Вы можете использовать типы Int8 для 8-битных ints, Int32 для 32-битных int и Int64 для 64-битных ints.

Source

+0

Я вижу, спасибо за точный ответ – swang

4

Чтобы ответить , почему это делается таким образом в Haskell: в отличие от C и C++, реализации Haskell по умолчанию "поле" все, даже примитивных типов. Это необходимо для большинства удивительных особенностей полиморфизма (хотя, что еще более удивительно, вложение может часто избавить вас от большей части наложенных издержек), а также ленивость. В результате даже Bool занимает как минимум память общего указателя: 64 бит на платформе AMD64! Может показаться очень расточительным, но редко возникает проблема: во время обработки все данные загружаются в несколько регистров, которые в любом случае такие большие, и для хранения вы всегда можете использовать более эффективные «упакованные» контейнеры. Во всяком случае, это означает, что на самом деле не имеет никакого преимущества использовать тип с 32 битами данных против одного с 64 битами для вычислений, в то время как в 64-битной архитектуре. Но, очевидно, есть много ситуаций, когда дополнительные бит пригождаются; когда вы знаете, они вам понадобятся, вы всегда можете прямо указать Int64. Но тогда это дорого стоит в самом важном смысле, пока вы работаете на 32-битной платформе, потому что память будет намного более плотной.

Часто, когда большие числа может повернуть вверх, но не очень характерно, это более эффективно использовать только «родной» тип, но проверить на maxBound, чтобы избежать переполнения.

0

Предыдущие ответы не отвечают на вопрос «Каков размер Int», а скорее предоставляют методы для нахождения экстремальных значений.

Data.Bits предоставляет bitSizeMaybe и finiteBitSize, чтобы узнать размер бита. Они заменяют bitSize из того же модуля.

finiteBitSize :: b -> Int 

Возвращает число битов в типе аргумента. Значение аргумента игнорируется.

finiteBitSize = bitSize 
bitSizeMaybe = Just . finiteBitSize 

Пример использования:

> import Data.Bits 
> finiteBitSize (42 :: Int) 
64 
Смежные вопросы