2016-10-05 2 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-битных, а длинный int - 8 байтов, размер строки.Как использовать бит-поле для получения целых битов строки?

Во-первых, я назначаю два значения в младшие 32 бит и выше 32 бит.

Что делать, если я хочу получить 64 бита и использовать его?

Нужно ли делать часть 2 или есть простой способ битового поля?

+3

С «союзом»? –

+1

По какой-либо причине вы знаете о 'uint64_t' и используете его частично, но затем используете' unsigned long', у которого не гарантируется наличие 64 бит? И почему бы не печатать непосредственно типы 'uint64_t'? Вы знаете о 'inttypes.h'? – Olaf

+0

«Что делать, если я хочу получить 64 бита и использовать его?» Что вы хотите достичь? – SGM1

ответ

1

Weather Vane только дробно впереди меня ...!

Вы используете союз. Там один в заголовках Win32 (не уверен, мне это нравится) под названием ULARGE_INTEGER, но вот быстрый пример союз, который paraphases этот союз:

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

Таким образом, если у вас ULARGE_INTEGER а, a.QuadPart даст вам 64-разрядную часть и auLowPart даст вам 32 разряда. Или высокие 32 бита, если ваша машина была большой.

Смежные вопросы