ISO C标准允许使用三种编码方法来表示带符号的整数:补码、反码和原码。
有什么有效或好的方法可以在运行时(或其他时间,如果有更好的解决方案)检测编码呢?我想知道这个信息,以便为不同的可能性优化大数库。
我计划在程序每次运行时计算并将其存储在一个变量中,因此它不必非常快 - 我假设编码不会在程序运行期间改变 :-)
ISO C标准允许使用三种编码方法来表示带符号的整数:补码、反码和原码。
有什么有效或好的方法可以在运行时(或其他时间,如果有更好的解决方案)检测编码呢?我想知道这个信息,以便为不同的可能性优化大数库。
我计划在程序每次运行时计算并将其存储在一个变量中,因此它不必非常快 - 我假设编码不会在程序运行期间改变 :-)
-1&3
的内容检查常量 -1
的低位即可。#if #else
构造内的预处理器表达式中完成。if (-x == ~x)
。检测二的补码也应该非常容易: if (-x == ~x + 1)
。如果不是这两种情况,那么它必须是符号/大小格式。#if
测试中使用它们:#define TWOSCOMPLEMENT(〜-1 == 0)
,然后 #if TWOSCOMPLEMENT
。 - cafx
,所以在边界情况下需要小心。特别是对于二进制补码中的一个恶劣情况,即 -x
可能会导致未定义的行为,例如 -INT_MIN
可能会超出范围。 - Jens Gustedt为什么不在编译时就做呢?如果需要,您可以让构建脚本/Makefile编译测试程序,然后使用预处理器进行条件编译。这也意味着性能大大不那么重要,因为它只运行一次每次编译,而不是每次运行。
获得一个指向显示不同位模式的int的指针。将其强制转换为无符号int类型的指针,然后检查位值。
选择一些特定的值进行操作应该可以实现你想要的效果。
我猜你可以将一个负数存储为一个int
,然后将其存储到足够大的char
数组中,并将该数组与各种表示进行比较以找出结果。
但是,呃...无符号整数不应该有符号,对吧?