ISO C 标准允许有符号整数的三种编码方法:二进制补码、二进制补码和符号/大小。
在运行时(或者如果有更好的解决方案,在其他时间)检测编码的有效或好的方法是什么?我想知道这一点,这样我就可以针对不同的可能性优化一个 bignum 库。
我计划在每次程序运行时计算它并将其存储在一个变量中,这样它就不必非常快 - 我假设编码在程序运行期间不会改变:-)
ISO C 标准允许有符号整数的三种编码方法:二进制补码、二进制补码和符号/大小。
在运行时(或者如果有更好的解决方案,在其他时间)检测编码的有效或好的方法是什么?我想知道这一点,这样我就可以针对不同的可能性优化一个 bignum 库。
我计划在每次程序运行时计算它并将其存储在一个变量中,这样它就不必非常快 - 我假设编码在程序运行期间不会改变:-)
-1
你只需要用类似的东西检查常数的低位-1 & 3
。这评估为
这甚至应该可以在构造内部的预处理器表达式中#if #else
完成。
检测一个人的补码应该很简单——比如if (-x == ~x)
. 检测二进制补码应该同样简单:if (-x == ~x + 1)
. 如果两者都不是,那么它必须是符号/大小。
为什么不在编译时做呢?如果需要,您可以让构建脚本/makefile 编译测试程序,然后使用预处理器进行条件编译。这也意味着性能不那么重要,因为它每次编译只运行一次,而不是每次运行一次。
获取指向将显示独特位模式的 int 的指针。将其转换为指向 unsigned int 的指针,然后检查位值。
使用几个精心选择的值来执行此操作应该可以满足您的需求。
我猜你会将一个负数存储为一个int
足够char
大的数组以容纳它,并将该数组与各种表示形式进行比较以找出答案。
但是嗯...无符号整数不应该有符号,是吗?