2013-04-05 2 views
3

Word8, Word16Word32 값이 많이 있다고 가정합니다. 나는 그것들을 넓히고 서명 된 것으로 해석하고 서명하지 않은 것을 해석하여 모든 것을 [Int64]에 저장할 수 있습니다.부호없는 정수를 부호있는 것으로 해석하는 중

*Main> convert8 False 128 
128 
*Main> convert8 True 128 
-128 

:

convert8 :: Bool -> Word8 -> Int64 
convert8 False i = fromIntegral i 
convert8 True i = fromIntegral (fromIntegral i :: Int8) 

이 나에게 내가 원하는 결과를 얻을 : 나는 첫 번째 인수가 서명 여부로 우리가 Word8 해석할지 여부를 지정합니다 다음과 같은 기능, 같은 것을 쓸 수있어 두 배 fromIntegral는 저에게 우아하지 않다, 그러나 느낀다. "이 Word을 부호있는 정수로 해석하여 더 큰 숫자로 Int"이라고 말하는 것이 더 좋은 방법일까요?

+0

'convert8 True = negate에 문제가 있습니까? 에서 '? –

+0

음, 네, 부정을 원하지 않기 때문에 부호없는 정수가 부호로 해석되기를 원합니다. 그 'convert8 사실 1 == 1'. –

+0

하지만'convert True '는 네가 부정적인 가치를 원한다는 것을 의미한다고 생각해. 그런 혼란스러운 디자인! 부울 값이 '참'이고 값이 음수이면 음수 값을가집니다. 부호가있는 유형 (즉, 부호가있는 유형의 양수 값의 범위를 벗어남)을 사용할 때 단어는 음수입니까? –

답변

3

GHC는 모든 정수를 하나의 기계어로 저장합니다. (즉, 32 비트 GHC는 정수를 32 비트로 저장합니다 .64 비트 GHC는이를 64 비트로 저장합니다.) 따라서 8 비트 정수를 요청하면 어쨌든 32 비트로 저장하지만 만 사용합니다 처음 8 비트.

이 때문에 나는 fromIntegral을 사용하여 확장하거나 축소하는 것이 런타임에 실제로 아무 작업도하지 않는다는 것을 확신합니다. 런타임시 비용없이 유형 서명을 변경하는 것뿐입니다. (부호가없는 부호에서 부호로 변환하는 것은 부호 확장을하고 있을지도 모르지만, 나는 그 부분이 어떻게 작동 하는지를 아직 확신하지 못하고있다.)

간단히 말해서 double fromIntegral은 아마도 이렇게하는 가장 좋은 방법. 직접 기호 확장을 수동으로 구현할 수도 있지만 이렇게하기위한 내장 된 기계 명령은 더 빠를 가능성이 높습니다.

관련 문제