int16_t 的补码表示

Two's Complement Representation of int16_t

我正在尝试显示 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;
}

您的代码有很多问题,甚至无法编译。您需要了解什么是指针,什么不是。如何使用 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);
    }
}

complement右移i位,测试low-order位是0还是1,将对应的字符放入[=17] =].

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。自动将有符号整数转换为无符号整数 returns 它的二进制补码值。所以你可以简单地做:

uint16_t complement = (uint16_t)value;