Двухкомпонентное представление int16_t

#c #bit #twos-complement #uint16

#c #бит #двойки-дополнение #uint16

Вопрос:

Я пытаюсь отобразить строковое представление дополнения int16_t к двум. Я нахожу дополнение к двум с помощью (uint16_t)~value 1;

Как мне добавить 16 бит в строку?

 char* getBits(const int16_t value) {

    uint16_t complement = (uint16_t)~value   1;
    char bits = malloc(16*sizeof(char*))

    for (int i = 0; i < 16; i  ) {
        bits[i] = // something
    }
    return bits;
}
  

Комментарии:

1. Добавьте '' в конец bits и используйте printf("%s", bits) .

2. бит пуст??

3. Пожалуйста, не редактируйте свой исходный код на основе ответа здесь. Это делает опубликованные ответы бессмысленными (например, изменение Бармара с char на char * ). Вы можете отредактировать свой вопрос и добавить дополнительный код внизу. Или вы можете показать свой окончательный / обновленный ответ в своем собственном ответе [если хотите].

Ответ №1:

Сдвиньте complement правые i биты и проверьте, является ли младший бит 0 или 1 и введите соответствующий символ bits .

 bits[i] = (complement >> i) amp; 1 ? '1' : '0';
  

Кроме того, вам необходимо выделить дополнительный символ в вашей строке для нулевого терминатора. И bits должен быть указателем, а размер элемента sizeof(char) — нет sizeof(char*) .

 char *bits = malloc(17*sizeof(char));
bits[16] = 0;
  

Нет необходимости использовать формулу (uint16_t)~value 1 . Преобразование подписанного int в unsigned int автоматически возвращает его значение дополнения twos. Таким образом, вы можете просто сделать:

 uint16_t complement = (uint16_t)value;
  

Комментарии:

1. Почему не malloc((16 1)*sizeof(char))

2. почему sizeof(char)?

3. Я обычно не удаляю это, когда операционная система использует его. Это излишне, но имеет смысл.

Ответ №2:

В вашем коде много проблем, и он даже не компилируется. Вам нужно узнать, что является указателем, а что нет. Как использовать malloc и где хранить его результат. Лучший способ — прочитать хорошую книгу на Си.

 #include <stdint.h>
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

char* getBits(const int16_t value) 
{
    uint16_t complement = value;
    char *bits = malloc(sizeof(value) * CHAR_BIT   1);
    char *wrk = bits;

    if(bits)
    {
        for (unsigned i = 1 << 15; i; i >>= 1) 
        {
            *wrk   = (complement amp; i) ? '1' : '0';
        }
        *wrk   = 0;
    }
    return bits;
}



int main(void)
{
    for(int i = 0; i > -15; i --)
    {
        char *bits;
        printf("%d - %sn", i, (bits = getBits(i)));
        free(bits);
    }
}