haskell - 添加与进行Word8

标签 haskell integer-overflow

我找不到函数addWithCarry :: Word8 -> Word8 -> (Word8, Bool)已在 base 中定义。唯一记录为关心进位的函数似乎是 addIntC#GHC.Prim但它似乎永远不会通过各种抽象层向上推。

我显然可以通过测试输出值是否在范围内来推出我自己的,这实际上就是我当前正在做的事情,但我宁愿重用一个(可能更有效)已经定义的值。

有这样的事吗?

最佳答案

如果你看the source for Word8's Num instance ,您将看到一切都是通过转换为 Word# 未装箱值并对其执行操作,然后缩小到 8 位值来完成的。我怀疑对 Word# 值进行比较会更有效,所以我实现了这样的事情。这是available on lpaste (我发现它比 StackOverflow 更容易阅读)。

请注意,它包括测试套件和 Criterion 基准测试。在我的系统上,所有各种测试对于盒装版本(user5402 的实现)大约需要 31 纳秒,对于 primops 版本大约需要 24 纳秒。

上面 lpaste 中的重要函数是 primops,它是:

primops :: Word8 -> Word8 -> (Word8, Bool)
primops (W8# x#) (W8# y#) =
    (W8# (narrow8Word# z#), isTrue# (gtWord# z# 255##))
  where
    z# = plusWord# x# y#

关于haskell - 添加与进行Word8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27204425/

相关文章:

sqlite - 没有 Database.SQLite.Simple.FromField.FromField Char 的实例

scala - 如果数据结构是可折叠的,它是幺半群吗?

api - Haskell:节目搞砸了?

c - 具有灵活位大小的定时器环绕

haskell - Haskell 程序可以表示为 Lisp S 表达式吗?

arrays - 对 MutableByteArray 的写入是原子的吗?

c# - 1000000000 * 3 = -1294967296?

c - 无符号变量发生整数溢出

c++ - “Symmetrical difference”,用于无符号整数-假定翻转

java - 如何捕获 Spring MVC 中的整数溢出错误?