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