两个大数相乘给出错误的结果

Multiplying two large numbers gives the wrong result

我在下面的代码中乘以 p*q 时得到了错误的结果:

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <time.h>
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include <math.h>

uint32_t random_prime(void);
bool is_prime(uint32_t);

int main(void) {
    
    srand((unsigned int) time(NULL));
    uint32_t p = random_prime();
    uint32_t q = random_prime();
    while (p == q) {
        q = random_prime();
    }
    uint64_t N = (uint64_t) p * q;

    printf("\np = %"PRIo32"\n", p);
    printf("q = %"PRIo32"\n", q);
    printf("N = %"PRIo64"\n", N);
}

这是我得到的输出:

p = 27545553743
q = 24276636245
N = 742634106633630654517

这显然是错误的结果。我不认为这可能是一个溢出问题,因为 uint64_t 应该能够保存两个 uint32_t 的任何结果。 auint32_t的最大值为4294967295。4294967295^2 = 18446744065119617025。auint64_t的最大值为18446744073709551615,较大。我不知道为什么我的输出可能是错误的。帮忙?

N 正确的结果,因为您打印的所有数字都是八进制的,而不是基数 10。