2016-10-05 3 views
-1
#include <stdio.h> 
#include <stdint.h> 

struct __attribute__((__packed__)) sf_header 
{ 
    uint64_t lower: 32; 
    uint64_t higher: 32; 
}; 
int main() 
{ 
    struct sf_header h; 

    // part 1; 
    h.lower = 15; 
    h.higher = 1; 

    printf("lower part: %d\n", h.lower); 
    printf("higher part: %d\n", h.higher); 

    //part 2: how to printf the whole 64-bits (a row) 
    unsigned long int lower = h.lower; 
    unsigned long int higher = h.higher; 
    higher = higher << 32; 

    printf("lower: %ld\n", lower); 
    printf("higher: %ld\n", higher); 

    unsigned long int final = lower | higher; 
    printf("Final: %ld\n", final); 


    return 0; 
} 

64 비트에서 실행되며 long int는 8 바이트 크기의 행입니다.비트 필드를 사용하여 전체 행 비트를 얻는 방법은 무엇입니까?

먼저 하위 32 비트와 상위 32 비트에 두 값을 할당합니다.

64 비트를 가져와 사용하려면 어떻게해야합니까?

파트 2를 수행해야합니까, 아니면 비트 필드를 사용하는 쉬운 방법이 있습니까?

+3

'합집합'이란? –

+1

당신이'uint64_t'를 알고 그것을 부분적으로 사용하는 이유가 무엇이든간에 64 비트를 보장하지 않는'unsigned long'을 사용하는 이유는 무엇입니까? 그리고 왜'uint64_t' 타입을 직접 출력하지 않습니까? 'inttypes.h'에 대해 알고 있습니까? – Olaf

+0

"64 비트를 가져와 사용하려면 어떻게해야합니까?" 성취하고자하는 것은 무엇입니까? – SGM1

답변

1

날씨 베인이 나보다 앞서 ... ...!

유니언을 사용합니다. 이 ULARGE_INTEGER라고는 Win32 헤더 (나는 그것을 좋아하지 확실하지)의 하나이지만 여기에 노동 조합 paraphases 빠른 조합의 예입니다 : 따라서

typedef union { 
    struct { 
    int32_t LowPart; 
    int32_t HighPart; 
    } u; 
    uint64_t QuadPart; 
} ULARGE_INTEGER; 

을 당신은 ULARGE_INTEGER A, a.QuadPart는 당신에게 64 비트 부분을 줄 것이라고이 있다면 auLowPart는 32 비트를 줄 것입니다. 또는 머신이 빅 엔디안이라면 32 비트가됩니다!