저는 GNU PDF 라이브러리의 소스, 특히 64 비트 정수의 구현을 읽었습니다. 그들은 64 비트 정수를 두 개의 32 비트 정수의 구조체로 정의했습니다. 상위 int는 부호이고 하위 int는 부호가 없습니다. 다음은 헤더 파일의 관련 코드입니다.2의 보수 형태로 된 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;
음수는 2의 보수 형식으로 표시됩니다. 그래도 난이 기능에 대한 의심의 여지가 있습니다
이[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);
}
}
나는 숫자의 2의 보수를 얻기 위해, 읽은 내용에서를, 당신은 모든 비트를 반전하고 1을 추가해야 결과. 위의 함수에서 값 < 0의 경우 상위 비트를 0xFFFFFFFF로만 설정하지만 하위 비트는 전혀 변경하지 않습니다. 'value'의 비트도 반전되어서는 안되며 1을 더하면 안됩니까? 누군가 이것을 설명 할 수 있습니까?
감사합니다.
이 코드는 부호없는 정수 유형의 범위를 벗어난 값을 해당 유형의 변수에 할당하여 정의되지 않은 동작을합니다. 대신'-1'을 할당해야합니다. –