Я пишу библиотеку bignum и хочу использовать эффективные типы данных для представления цифр. Особенно целое для цифры и длинное (если строго удваивает размер целого) для промежуточных представлений при сложении и умножении.
Я буду использовать некоторые функции C99, но попытаюсь соответствовать ANSI C.
В настоящее время в моей библиотеке bignum есть следующее:
#include <stdint.h>
#if defined(__LP64__) || defined(__amd64) || defined(__x86_64) || defined(__amd64__) || defined(__amd64__) || defined(_LP64)
typedef uint64_t u_w;
typedef uint32_t u_hw;
#define BIGNUM_DIGITS 2048
#define U_HW_BITS 16
#define U_W_BITS 32
#define U_HW_MAX UINT32_MAX
#define U_HW_MIN UINT32_MIN
#define U_W_MAX UINT64_MAX
#define U_W_MIN UINT64_MIN
#else
typedef uint32_t u_w;
typedef uint16_t u_hw;
#define BIGNUM_DIGITS 4096
#define U_HW_BITS 16
#define U_W_BITS 32
#define U_HW_MAX UINT16_MAX
#define U_HW_MIN UINT16_MIN
#define U_W_MAX UINT32_MAX
#define U_W_MIN UINT32_MIN
#endif
typedef struct bn
{
int sign;
int n_digits; // #digits should exclude carry (digits = limbs)
int carry;
u_hw tab[BIGNUM_DIGITS];
} bn;
Поскольку я не написал процедуру для записи bignum в десятичном формате, я должен проанализировать промежуточный массив и распечатать значения каждой цифры. Однако я не знаю, какой спецификатор преобразования использовать с printf. Предпочтительно я хотел бы написать в терминал цифру, закодированную в шестнадцатеричном формате.
Основная проблема заключается в том, что мне нужны два типа данных, один из которых в два раза длиннее другого, и в дальнейшем буду использовать их с printf с использованием стандартных спецификаторов преобразования. Было бы идеально, если бы int был 32-битным, а long - 64-битным, но я не знаю, как гарантировать это с помощью препроцессора, и когда приходит время использовать такие функции, как printf, которые полагаются исключительно на стандартные типы, я больше не знаю, что использовать.