15

ISO C 标准允许有符号整数的三种编码方法:二进制补码、二进制补码和符号/大小。

在运行时(或者如果有更好的解决方案,在其他时间)检测编码的有效或好的方法是什么?我想知道这一点,这样我就可以针对不同的可能性优化一个 bignum 库。

我计划在每次程序运行时计算它并将其存储在一个变量中,这样它就不必非常快 - 我假设编码在程序运行期间不会改变:-)

4

5 回答 5

17

-1你只需要用类似的东西检查常数的低位-1 & 3。这评估为

  1. 对于符号和大小,
  2. 为一个人的补码和
  3. 为二进制补码。

这甚至应该可以在构造内部的预处理器表达式中#if #else完成。

于 2010-09-29T07:22:05.500 回答
12

检测一个人的补码应该很简单——比如if (-x == ~x). 检测二进制补码应该同样简单:if (-x == ~x + 1). 如果两者都不是,那么它必须是符号/大小。

于 2010-09-29T06:39:37.157 回答
2

为什么不在编译时做呢?如果需要,您可以让构建脚本/makefile 编译测试程序,然后使用预处理器进行条件编译。这也意味着性能不那么重要,因为它每次编译只运行一次,而不是每次运行一次。

于 2010-09-29T06:39:44.243 回答
0

获取指向将显示独特位模式的 int 的指针。将其转换为指向 unsigned int 的指针,然后检查位值。

使用几个精心选择的值来执行此操作应该可以满足您的需求。

于 2010-09-29T06:41:36.610 回答
-1

我猜你会将一个负数存储为一个int足够char大的数组以容纳它,并将该数组与各种表示形式进行比较以找出答案。

但是嗯...无符号整数不应该有符号,是吗?

于 2010-09-29T06:40:02.443 回答