Я читал исходники библиотеки 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 к результату. В вышеупомянутой функции, тем не менее, для значения <0 они только устанавливают биты старшего разряда в 0xFFFFFFFF, но не изменяют биты младшего разряда вообще. Разве биты «значения» тоже не должны быть инвертированы с последующим добавлением 1? Может кто-нибудь объяснить это? </p>
Спасибо.