我正在阅读 GNU PDF 库的源代码,尤其是它们对 64 位整数的实现。他们将 64 位整数定义为两个 32 位整数的结构 - 高阶 int 是有符号的,低阶 int 是无符号的。这是头文件中的相关代码:
/*Definition of internal structure of the pdf_i64_t type*/
struct pdf_i64_s
{
pdf_i32_t high;
pdf_u32_t low;
};
typedef struct pdf_i64_s pdf_i64_t;
根据架构手册,负数以二进制补码形式表示。我对此功能有疑问:
[来自pdf-types.c 的代码]
void pdf_i64_assign_quick (pdf_i64_t *bignum,
const pdf_i32_t value,
pdf_status_t *p_status)
{
ASSIGN_SAFE(p_status, PDF_OK);
if (bignum != NULL)
{
if (value < 0)
{
bignum->high = 0xFFFFFFFF;
}
else
{
bignum->high = 0;
}
bignum->low = value;
}
else
{
ASSIGN_SAFE(p_status, PDF_ERROR);
}
}
根据我的阅读,要获得数字的二进制补码,您需要反转所有位并将结果加 1。但是,在上述函数中,对于 value<0,它们仅将高位设置为 0xFFFFFFFF,但根本不更改低位。'value'的位不应该也反转,然后加1吗?有人可以解释一下吗?
谢谢。