串行 printf 运行 GMP on STM32 with mbed framework

Serial printf running GMP on STM32 with mbed framework

对于一个大学项目,我正在研究 RSA-CRT 实现。我使用 mini-gmp,GMP 库的一个子集来处理大整数。

该项目的目标是 运行 STM32F103 微控制器上的程序,我想将其与 ARM mbed 框架一起使用。

问题是我无法正确地将大整数打印到串行控制台进行调试。这是我的代码的一个最小工作示例:

#include <mbed.h>
#include <mini-gmp.h>

//SETUP
Serial pc(USBTX, USBRX); // enable serial communication, tx, rx

int main(){

  pc.baud (115200);
  printf("STARTING\n\r");

  mpz_t n;
  mpz_init_set_ui(n,11242342351435632235235464577);

  mpz_out_str(stdout, 10, n);
  printf("\nFINISHED\n\r");
}

在微控制器上使用 PlatformIO 和 运行ning 进行编译时,我在串行控制台中得到了这个:

STARTING
3485947265
FINISHED 

我注意到打印的数字总是 10 位长,并且以 3 开头,其余数字随 n 的值而变化。所以对我来说它看起来不像是某种溢出。

这里有人可以帮我吗?

mpz_init_set_ui()的原型是

void mpz_init_set_ui (MP_INT *dest_integer, unsigned long int src_ulong);

它需要一个 unsigned long 参数,在这个平台上它是 32 位长。 C 常量在 被传递 to mpz_init_set_ui().

之前被截断为 32 位

11242342351435632235235464577 mod (2^32) = 3485947265,这就是你得到的。

您应该使用可以使用任意精度参数对其进行初始化的函数,例如 mpz_init_set_str()