我正在一个项目中使用libdecnumber,并且库中有一个特殊的小函数,其文档让我有些困惑。该函数为decNumberCopy()
decNumber * decNumberCopy(decNumber *, const decNumber *);
以下是decNumber
/* The size (integer data type) of each unit is determined by the */
/* number of digits it will hold. */
#if DECDPUN<=2
#define decNumberUnit uint8_t
#elif DECDPUN<=4
#define decNumberUnit uint16_t
#else
#define decNumberUnit uint32_t
#endif
/* The number of units needed is ceil(DECNUMDIGITS/DECDPUN) */
#define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN)
/* The data structure... */
typedef struct {
int32_t digits; /* Count of digits in the coefficient; >0 */
int32_t exponent; /* Unadjusted exponent, unbiased, in */
/* range: -1999999997 through 999999999 */
uint8_t bits; /* Indicator bits (see above) */
/* Coefficient, from least significant unit */
decNumberUnit lsu[DECNUMUNITS];
} decNumber;
以下是libdecnumber文档对decNumberCopy()
decNumberCopy(数字,来源)
此函数用于将一个decNumber结构的内容复制到另一个。当结构可能具有不同的大小时使用它,因此通过C赋值的简单结构复制是不合适的。当数字相对于结构的大小较短时,它也可能具有性能优势,因为只复制包含源结构中使用的数字的单元。
所以撇开简单的结构赋值就足以复制decNumber
这一事实,任何对libdecnumber如何工作更深入了解的人都可以告诉我两个decNumber
结构何时不同?即使假设你已经汇集了两个不同的DECNUMUNITS
值的编译模块(这真的是一件非常糟糕的事情),decNumber
中没有大小成员,所以函数不会无论如何能够检测到不同大小的结构。
或者,或许decNumberCopy()
是否适用于将来允许个别decNumber
大小不同的未来库版本?
答案 0 :(得分:1)
我猜这个来自decNumber.h
的评论应该解释一下:
/* Notes: */
/* 1. If digits is > DECDPUN then there will be more than one */
/* decNumberUnits immediately following the first element of lsu. */
/* These contain the remaining (more significant) digits of the */
/* number, and may be in the lsu array, or may be guaranteed by */
/* some other mechanism (such as being contained in another */
/* structure, or being overlaid on dynamically allocated storage). */
换句话说,decNumber结构包含decNumberUnit lsu[DECNUMUNITS]
数组以保存'默认'数字位数,但是如果需要,库将使数组增长超过该大小。
更新
快速浏览一下decNumber.c
(我不知道它与最新的有多接近)看起来好像他们没有实现任何支持存储数字超出decNumber.lsu[DECNUMUNITS]
中可以保存的数字。看起来decNumberCopy()
更关心的是只复制使用过的lsu[DECNUMUNITS]
元素而不是整个元素(作为优化和/或允许测试来检测可能的数据损坏)。