C模数返回负数

时间:2015-11-10 00:24:00

标签: c int modulus negative-number int128

我的数据类型为unsigned __int128 data;,所以我不认为这是一个类型问题,但我不知道它为什么会出现

#include <stdio.h>

int main(int argc, char *argv[]) {
    unsigned __int128 z = 1911602146;
    unsigned __int128 n = 4003562209;

    //case 1
        unsigned __int128 result = fmod((pow(z, 2)  * 2), n);
        printf("%d\n", result);

    //case 2
        unsigned __int128 result_2 = fmod(pow(z, 2), n);
        printf("%d\n", result_2);
}

返回:

-669207835 => this is the correct option and it should be 7629321670
-480306461

3 个答案:

答案 0 :(得分:1)

printf("%d\n", result);
//      ^^

%d需要int。您将unsigned __int128传递给它,导致未定义的行为。最有可能的是,printf正在参与result的代表,并将其解释为int

我不知道正确的格式说明符是什么,但你应该找到合适的格式说明符并使用它。此外,您不应该在数据上使用浮点函数;你在那里失去了精确度。

答案 1 :(得分:0)

首先,__int128GNU CC extension,因此没有可移植的方法来处理它们,也不是一种可移植的方式来打印它们。

碰巧是,(讽刺的是......)对于printf ing(),__int128unsigned __int128来说,甚至没有来自Glibc的支持。

唯一的替代方法是编写自己的函数以十进制格式打印出来,或者更好的是,用十六进制格式打印出来,因为这种大整数在十进制中变得非常难以理解。

BTW,这是未定义的行为:

printf("%d\n", result);

因为"%d"说明符需要int作为参数,所以不能少,仅此而已。

我希望这能为你带来一些启示!

答案 2 :(得分:0)

首先避免计算过程中的浮点跳闸 然后,仅用于打印,将结果(大于&lt; 10 ^ 10)转换为double以便使用printf函数

unsigned __int128 z = 1911602146;
unsigned __int128 n = 4003562209;

unsigned __int128 result = (z * z * 2) % n;
printf("%.0lf\n", (double)result);

unsigned __int128 result_2 = (z * z) % n;
printf("%.0lf\n", (double)result_2);

那应该给你

3625759213
3814660711

(因此,你不能得到7629321670,因为它大于模数操作数,&#39; n&#39;)