c - 使用 mbed 框架在 STM32 上运行 GMP 的串行 printf

标签 c stm32 mbed

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

该项目的目标是在 STM32F103 微 Controller 上运行程序,我想将其与 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 编译并在微 Controller 上运行时,我在串行控制台中得到了这个:

STARTING
3485947265
FINISHED 

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

这里有人可以帮我吗?

最佳答案

mpz_init_set_ui() 的原型(prototype)是

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

它需要一个 unsigned long 参数,在这个平台上它是 32 位长。 C 常量在传递给 到 mpz_init_set_ui() 之前被截断为 32 位。

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

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

关于c - 使用 mbed 框架在 STM32 上运行 GMP 的串行 printf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50023939/

相关文章:

c - 在 Apple MAC book 上为 STM 编译 ARM 二进制文件的问题

c - 为什么通过直接赋值复制结构会失败?

c++ - 正确发送消息 UART

检查矩阵的第一行和最后一行是否只有负值

c - 函数返回后局部变量仍然存在

c - 静态内存分配和可移植性

c - 在 STM32 中从 RAM 执行代码

c++ - 如何每 6 小时中断一次

c++ - 函数局部变量在函数调用之间持续存在

c - 从 C 中的数组创建子数组的最佳方法