Серийный printf работает GMP на STM32 с каркасом mbed - PullRequest
0 голосов
/ 25 апреля 2018

для университетского проекта. Я работаю над реализацией RSA-CRT.Я использую mini-gmp , подмножество библиотеки GMP для обработки больших целых чисел.

Цель проекта - запустить программу на микроконтроллере STM32F103, который я хочу использовать сARM mbed framework.

Проблема в том, что я не могу правильно вывести большие целые числа на последовательную консоль для отладки.Вот минимальный рабочий пример моего кода:

#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 и запуске на микроконтроллере я получаю это в последовательной консоли:

STARTING
3485947265
FINISHED 

Я заметил напечатанное числовсегда длиной 10 цифр и начиная с 3, остальные цифры меняются в зависимости от значения n .Так что это не похоже на какое-то переполнение для меня.

Может ли кто-нибудь здесь помочь мне?

1 Ответ

0 голосов
/ 25 апреля 2018

Прототипом для mpz_init_set_ui() является

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

Он ожидает аргумент unsigned long, который на этой платформе имеет длину 32 бита.Константа C усекается до 32 бит перед тем, как передается to mpz_init_set_ui().

11242342351435632235235464577 mod (2 ^ 32) = 3485947265, то есть, что вы получили.

Вы должны использовать функцию, которая может инициализировать ее с параметром произвольной точности, например mpz_init_set_str().

...