我正在编写一个bignum库,我想使用高效的数据类型来表示数字。特别是数字的整数,以及加法和乘法时中间表示的长整型(如果严格地是整数大小的两倍)。
我将使用一些C99功能,但要尽量符合ANSI。
目前,我的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;因为我还没有编写一个过程来写十进制的二进制,所以我必须分析中间数组并输出每个数字的值。但是,我不知道在printf中使用哪个转换说明符。优选地,我想向终端写入以十六进制编码的数字。
潜在的问题是,我想要两种数据类型,一种长度是另一种的两倍,并使用标准转换说明符在printf中进一步使用它们。如果int是32位,long是64位,那就太理想了,但我不知道如何使用预处理器来保证这一点,当需要使用像printf这样仅依赖于标准类型的函数时,我不再知道该使用什么。
发布于 2010-05-01 04:32:14
您可以使用<inttypes.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
#define PRI_U_HW PRIu32 // use for formatting a `u_hw` type
#define PRI_U_W PRIu64 // use for formatting a `u_w` type
#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
#define PRI_U_HW PRIu16 // use for formatting a `u_hw` type
#define PRI_U_W PRIu32 // use for formatting a `u_w` type
#endif然后:
printf( "some u_w variable: %" PRI_U_W "\n", u_w_var);
printf( "some u_hw variable: %" PRI_U_HW "\n", u_hw_var);它们并不漂亮,但它们是C99如何做到的。
发布于 2010-05-01 06:04:48
ANSI C不能保证int和long的大小,我也不认为long long是ANSI类型。如果您不愿意或不能使用C99,唯一安全、可移植的解决方案是编写一个配置脚本,该脚本将创建使用sizeof的C程序,以查找具有所需属性的一对整数类型。然后,您可以在该脚本中生成宏,包括printf格式宏。
您不使用C99的原因也有可能是因为您在没有C99编译器的情况下移植到某个古怪的平台。在这种情况下,您只需弄清楚什么是有效的,就可以将其放在标题中,而不必担心可移植性。
C99并不美观,但它确实解决了一些令人讨厌的C语言问题。
https://stackoverflow.com/questions/2747435
复制相似问题