如何检测C中有符号整数的编码?

pax*_*blo 15 c signed twos-complement ones-complement

ISO C标准允许三种编码方法用于有符号整数:二进制补码,一个补码和符号/幅度.

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

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

Jen*_*edt 16

你只需-1要用类似的方法检查常量的低位-1 & 3.这评估为

  1. 标志和数量,
  2. 一个人的补充和
  3. 两个补码.

甚至可以在#if #else构造内部的预处理器表达式中执行此操作.


Jer*_*fin 12

检测一个补码应该非常简单 - 就像if (-x == ~x).检测两个补码应该很简单:if (-x == ~x + 1).如果它不是那些,那么它必须是符号/幅度.

  • 这些也是常量表达式,所以你可以在`#if`测试中使用它们:`#define TWOSCOMPLEMENT(〜-1 == 0)```#if TWOSCOMPLEMENT`. (5认同)
  • 对于所有`x`的情况,你的表达式不一定都是正确的,所以你应该小心边界情况.特别是对于两个补码有一个令人讨厌的情况,其中`-x`引起未定义的行为,即`-INT_MIN`可能超出界限. (3认同)