3

我有数据类型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
4

3 回答 3

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

%d期望一个int. 相反,您将其传递给它unsigned __int128,从而导致未定义的行为。最有可能的printf是,正在参与表示result并将其解释为int.

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

于 2015-11-10T00:31:52.337 回答
0

首先,__int128它是一个GNU CC 扩展,因此没有可移植的方式来处理它们,也没有可移植的方式来打印它们。

碰巧的是,对于printfing()、__int128s 和unsigned __int128s,甚至 Glibc 都不支持(具有讽刺意味的......)。

您唯一的选择是编写自己的函数以十进制或更好的十六进制打印出来,因为这种大整数很容易以十进制变得难以阅读。

顺便说一句,这是未定义的行为:

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

因为说明"%d"符需要一个intas 参数,仅此而已,仅此而已。

我希望这对你有所启发!

于 2015-11-10T00:37:34.927 回答
0

首先要避免计算过程中的浮点跳闸。
然后,仅用于打印,将结果(< 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,因为它比模操作数 'n' 大)

于 2015-11-10T01:00:35.807 回答