4

Word8タイプ、Word16、およびWord32横たわっている値がたくさんあるとします。一部を署名済み、一部を未署名として解釈して、それらをすべて[Int64]. 次の関数のようなものを記述できることはわかっています。ここで、最初の引数はWord8、署名付きとして解釈するかどうかを指定します。

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

これにより、私が望む結果が得られます。

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

ただし、ダブルfromIntegralは私にはエレガントではありません。Word「これを符号付き整数として解釈し、より大きなものに貼り付ける」と言うより良い方法はありIntますか?

4

1 に答える 1

4

私の記憶では、GHC はすべての整数を 1 つの機械語として格納します。(つまり、32 ビット GHC は整数を 32 ビットとして格納します。64 ビット GHC は整数を 64 ビットとして格納します。) したがって、8 ビット整数を要求すると、いずれにせよそれは 32 ビットとして格納されます、最初の 8 ビット。

fromIntegralこのため、 を使用して拡大または縮小することは、実際には実行時にノーオペレーションであると確信しています。ランタイム コストなしで型シグネチャを変更するだけです。(ただし、符号なしから符号付きへの変換は、符号拡張を行っている可能性があります。その部分がどのように機能するかは完全にはわかりません。ただし、おそらくまだ1つのマシン命令です。)

要するに、ダブルfromIntegralはおそらくこれを行うための最良の方法だと思います. 符号拡張を自分で手動で実装することもできますが、これを行うための組み込みの機械語命令の方が高速である可能性があります。

于 2013-04-05T07:49:58.527 に答える