c-是否可以比较两个多字整数,每个字只进行一次比较



这个问题与语言无关,但我将使用C,因为这是我编码它的语言。

给定两个分别跨越n_word个单词的整数ab,比较这些多单词编号的最有效方法是什么,例如确定a < b?(†(

作为一个具体的例子,我们可以将ab视为长度为n_word的8位整数数组,它们各自表示一个8*n_word位整数(并假设big-endian排序(。(††(或者,该问题可以使用常规的旧十进制数字来表述,例如,a = 456,其中a[0]是第一个数字(4(等。

我有以下代码可以工作,但我想知道是否有可能去掉两种比较中的一种:

for (unsigned int i = 0; i < n_word; ++i) {
if (a[i] > b[i]) {
i = n_word + 1;   /* use as magic number to indicate that a > b */
break;
}
else if (a[i] < b[i]) {
break;
}
}

然后由循环后i的值确定结果:

if i < n_word,  then a < b
if i > n_word,  then a > b
if i == n_word, then a == b

但我实际上并不想/需要区分这三种情况;把其中两个案子合并成一个完全没问题。然而,如果我只是删除(例如(>比较而不更改任何其他内容,则(在十进制示例中(a = 200b = 123(其中a > b(将评估为与a = 100b = 123(其中a < b(相同,这显然是不正确的。在循环中用<=替换<似乎同样是伪造的。


†尽管a > b或它们的任何一种转化也可以接受。

††不,当然我并不是实际上试图比较两个32位整数,而是更像10个32位的整数,它们形成了一个非常长的整数,超出了任何原生类型的范围。

您的担忧(存在多个比较(似乎是没有根据的。

ASM指令CMP设置FLAG寄存器,并且两个条件跳跃都基于这些标志来执行。

请参阅https://godbolt.org/z/rfxP185Mf

最新更新