-1

我试图显示一个 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;
}
4

2 回答 2

1

complement右移位i,测试低位是否为01,将对应的字符放入bits.

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

此外,您需要在字符串中为空终止符分配一个额外的字符。并且bits需要是一个指针,而元素大小是sizeof(char),而不是sizeof(char*)

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

没有必要使用公式(uint16_t)~value + 1。将有符号整数转换为无符号整数会自动返回其二进制补码值。所以你可以简单地做:

uint16_t complement = (uint16_t)value;
于 2020-09-30T23:23:38.400 回答
0

您的代码有很多问题,甚至无法编译。您需要了解什么是指针,什么不是。如何使用 malloc 以及在哪里存储它的结果。最好的方法是阅读一本好的 C 书。

#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 & i) ? '1' : '0';
        }
        *wrk++ = 0;
    }
    return bits;
}



int main(void)
{
    for(int i = 0; i > -15; i --)
    {
        char *bits;
        printf("%d - %s\n", i, (bits = getBits(i)));
        free(bits);
    }
}
于 2020-09-30T23:22:58.857 回答