我讀的是GNU PDF庫的源碼,尤其是它們的64位整數實現。他們將64位整數定義爲兩個32位整數的結構 - 高位int是有符號的,低位int是無符號的。以下是頭文件中的相關代碼:64位二進制補碼形式的負整數
/*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〜結果。在上述函數中,對於值< 0,它們只將高位設置爲0xFFFFFFFF,但根本不改變低位。 「價值」的位不應該反過來,然後再加上1?有人可以解釋這個嗎?
謝謝。
應該指出,這段代碼有未定義的行爲,將有符號整數類型範圍以外的值賦給該類型的變量。相反,它應該分配'-1'。 – 2010-09-21 02:52:03