我有一个问题是将整数类型的双愤怒号码转换为二进制,如下所示,
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
答案 0 :(得分:4)
解决方案是使用支持该范围数字的类型。
使用unsigned long long
或uint64_t
(假设您传递的是非负整数,否则请使用long long
或int64_t
)。然后你调用像这样的函数编辑从发布的评论中添加int64_t
到uint64_t
。 unsigned 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位。