Проблема со значениями структуры бита в c - PullRequest
0 голосов
/ 17 июня 2019

Привет. Я пытаюсь преобразовать десятичное значение в двоичное в c, используя struct.Ниже мой код:

#include <stdio.h>
struct binary{
    int bin:1 ;
};
void main(void){
    int dec = 24;
    struct binary bi[32];
    //printf("%d\n",sizeof(struct binary));
    for(int i = 0 ; i < 32 ; i++){
        int k = dec & 1;
        bi[i].bin = k;
        dec = dec >> 1;
        //printf("%d ",k);
    }
    for(int i = 31 ; i >= 0 ; i--){
        printf("%d ",bi[i].bin);
    }
}

Когда я печатаю значения, я вижу -1 вместо 1 в битовых полях (0000_0000_0000_0000_0000_0000_000-1_-1000).Может кто-то знает, почему это происходит?а также я думал, что размер структуры 1 бит, но когда я делаю sizeof (struct двоичный файл), он показывает 4 байта, вы знаете почему?

TIA

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Определение 1-битного большого битового поля довольно бессмысленно и плохо определяется стандартом. Большинство аспектов битовых полей не указаны, включая то, должно ли битовое поле int считаться подписанным или неподписанным. Лучший совет - избегать битовых полей на 100%, особенно при работе с отображением двоичной памяти.

Примечательно, что вы на самом деле ничего не конвертируете - вы просто копируете 32-битное целое число бит за битом, где вы могли бы скопировать все 32 бита за раз. Поскольку все данные в вашей программе уже находятся в двоичном виде, нет необходимости что-либо преобразовывать. Просто настройте процедуру печати:

uint32_t dec = 0xDEADBEEF;
const size_t bits = 8*sizeof(dec);
for(size_t i=0; i<bits; i++)
{
  uint32_t mask = (1u << (bits-i-1));  // mask from MSB to LSB
  printf("%d", (_Bool)(dec & mask));   // convert zero/non-zero value into 0 or 1
}

Выход:

11011110101011011011111011101111
0 голосов
/ 17 июня 2019

Это потому, что вы используете int, который подписан и имеет один бит, выделенный для обозначения знака.

Вы должны использовать unsigned int, например:

#include <stdio.h>
struct binary{
    unsigned int bin:1 ;
};
void main(void){
    int dec = 24; 
    struct binary bi[32];

    for(int i = 0 ; i < 32 ; i++){
        int k = dec & 1;
        bi[i].bin = k;
        dec = dec >> 1;

    }   
    for(int i = 31 ; i >= 0 ; i--){
        printf("%u ",bi[i].bin);
    }   
}
...