问题将双范围编号转换为二进制

时间:2018-01-13 03:50:41

标签: c

我有一个问题是将整数类型的双愤怒号码转换为二进制,如下所示,

void intToBin(int digit) {
    int b;
    int k = 0;
    char *bits;
    int i;

    bits= (char *) malloc(sizeof(char));
    while (digit) {
        b = digit % 2;
        digit = digit / 2;
        bits[k] = b;
        k++;
    }
    for ( i = k - 1; i >= 0; i--) {
        printf("%d", bits[i]);
    }
}

但是你可以看到该函数的参数输入是整数。

我在尝试使用intToBin(10329216702565230)时遇到了错误 因为10329216702565230超出整数范围。

如何将具有整数类型双重愤怒数的内容扩展为二进制数?

更新

我已更新以下代码

void intToBin(uint64_t digit) {
    int b;
    int k = 0;
    char *bits;
    int i;

    bits = malloc(sizeof digit * 64);

    while (digit) {
        b = digit % 2;
        digit = digit / 2;
        bits[k] = b;
        k++;
    }
    for ( i = k - 1; i >= 0; i--) {
        printf("%d", bits[i]);
    }

}

但我没有得到它应该怎么做以获得2的补充? 米 dmnngn

3 个答案:

答案 0 :(得分:4)

解决方案是使用支持该范围数字的类型。

使用unsigned long longuint64_t(假设您传递的是非负整数,否则请使用long longint64_t)。然后你调用像这样的函数编辑从发布的评论中添加int64_tuint64_tunsigned long long至少是64位 - 甚至可以更宽。 OP的评论是获得64位输出 - 更好地使用(u)int64_t

intToBin(10329216702565230U)

如果您想使用负数,请使用long long。这样称呼它 intToBin(10329216702565230L)

您没有分配足够的内存 - 您正在访问尚未分配的内存,从而导致Undefined behavior。您先分配了1 char,然后才分配。您可以通过重新分配来解决此问题 - 在循环内重新分配内存(在循环内一次重新分配1 char)。然后使用它。为什么不为realloc 64分配内存,而不是多次调用char,然后使用它来存储结果。最后,可以通过另一个realloc调用释放剩余空间。

您无需强制转换malloc的返回值(void*char*转换是隐式完成的)。 您没有检查malloc的返回值。 malloc可能会返回NULL,在这种情况下,您必须单独处理。例如: -

   #define NBITS 64
   ...
   ...
   bits = malloc(NBITS);
   if( bits == NULL ){
       perror("malloc failed");
       exit(EXIT_FAILURE);
   }

注意:随着unsigned long long至少是64位的考虑,将引入64个幻数。因此,在转换时,如果位数超过64,我们将使用它,我们将重新分配。更好的选择是使用chux所说的内容 - sizeof digit * CHAR_BIT

另外

bits[k] = b+'0';

我们正在输入ascii值,然后您可以像这样打印

printf("%c", bits[i]);

您忘记释放已分配的内存。没有释放它(free(bits)),你就会有内存泄漏。

Davic C. Rankins评论

答案 1 :(得分:1)

void intToBin(int digit)
{
int b;
int k = 0;
char *bits;
int i;

bits= (char *) malloc(sizeof(char));
while (digit) {
    b = digit % 2;
    digit = digit / 2;
    bits[k] = b;
    k++;
}
for ( i = k - 1; i >= 0; i--) {
    printf("%d", bits[i]);
}
}

答案很简单,

用int64_t替换int以使用64位而不是32位。 请试一试,告诉我们

答案 2 :(得分:0)

int替换为int64_t以使用64位而不是32位。