2010-02-14 3 views
2

저는 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을 더하면 안됩니까? 누군가 이것을 설명 할 수 있습니까?

감사합니다.

+0

이 코드는 부호없는 정수 유형의 범위를 벗어난 값을 해당 유형의 변수에 할당하여 정의되지 않은 동작을합니다. 대신'-1'을 할당해야합니다. –

답변

5

value은 이미 입니다. 부호가있는 32 비트 정수는 이미입니다. 음수 인 경우 이미 적절하게 반전되었습니다. 끝내야 할 모든 것이 표지 확장입니다. 번호를 부정하는 -

0

그것은 그 값이 32 비트 INT가 말한다 ... 값은 이미 필요 난 당신이 몇 가지를 혼합 있다고 생각

3

을 변경하지 않으려면 2 초 보수 형태가 될 것입니다 2의 보수 표기법으로 모든 비트를 뒤집고 하나 추가합니다.

여기에 부정은 없습니다. 이것은 값을 저장하고 부호 확장을하는 것입니다. 상위 비트는 상위 32 비트를 통해 확장되어야합니다. 이것은 입력이 이미 서명 되었기 때문에 진행됩니다. 2의 보수 입력입니다.

1

Anon은 이미이 질문에 대답했지만, 분기 작업없이 똑같은 일을하는 약간의 최적화를 게시하고 싶었습니다.

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) 
    { 
     bignum->high = (value >= 0) - 1; 
     bignum->low = value; 
    } 
    else 
    { 
     ASSIGN_SAFE(p_status, PDF_ERROR); 
    } 
} 

0xFFFFFFFF로는 -1 32 비트 헥스이고 또한 value의 음의 값과 양의 값을 0으로 0xFFFFFFFF를 높게 설정되도록 (값> 0)가 1 또는 0 중 어느 하나를 평가한다.

관련 문제