libdecnumber中decNumberCopy()的大小不同的结构?

时间:2011-03-24 16:39:50

标签: c

我正在一个项目中使用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 大小不同的未来库版本?

1 个答案:

答案 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]元素而不是整个元素(作为优化和/或允许测试来检测可能的数据损坏)。