C 发出将双量程数字转换为二进制的命令
我有一个问题,将integer类型的双rage数转换为二进制,如下所示C 发出将双量程数字转换为二进制的命令,c,C,我有一个问题,将integer类型的双rage数转换为二进制,如下所示 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;
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
超出整数范围
如何将整数类型的双倍rage数扩展为二进制
更新
我已经更新了下面的代码
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的补码?
M
dmnngn解决方案是使用支持该数字范围的类型 使用
unsigned long long
或uint64\u t
(假设传递的是非负整数,否则使用long long
或int64\u t
)。然后调用编辑后的函数,从发布的注释中将int64\u t
添加到uint64\u t
无符号long-long
至少为64位-甚至可以更宽。OP关于获得64位输出的评论-最好使用(u)int64\u t
intToBin(10329216702565230U)
如果您想使用负数,请使用long
intToBin(10329216702565230L)
您没有分配足够的内存-您正在访问尚未分配的内存,导致内存不足。您先分配了1个char
,然后没有分配。您可以通过重新分配-在循环内重新分配内存(在循环内一次重新分配1
char
)来解决这个问题。然后使用它。与其多次调用realloc
,不如为64
char
s分配内存,然后使用它存储结果。最后,可以通过另一个realloc
调用来释放剩余的空间
您不需要强制转换malloc
的返回值(void*
到char*
的转换是隐式完成的)。
您没有检查malloc
的返回值malloc
可能返回NULL
,在这种情况下,您必须单独处理。例如:-
#define NBITS 64
...
...
bits = malloc(NBITS);
if( bits == NULL ){
perror("malloc failed");
exit(EXIT_FAILURE);
}
注意:引入64幻数时,考虑到无符号long long
至少是64
位。因此,在转换时,我们将使用它,以防位数超过64
,我们将重新分配。更好的选择是使用chux所说的数字字符大小
也
我们将输入ascii值,然后您可以这样打印它
printf("%c", bits[i]);
您忘记释放分配的内存。如果不释放它(free(bits)
),就会出现内存泄漏
David C.Rankins评论解决方案是使用支持该数字范围的类型 使用
unsigned long long
或uint64\u t
(假设传递的是非负整数,否则使用long long
或int64\u t
)。然后调用编辑后的函数,从发布的注释中将int64\u t
添加到uint64\u t
无符号long-long
至少为64位-甚至可以更宽。OP关于获得64位输出的评论-最好使用(u)int64\u t
intToBin(10329216702565230U)
如果您想使用负数,请使用long
intToBin(10329216702565230L)
您没有分配足够的内存-您正在访问尚未分配的内存,导致内存不足。您先分配了1个char
,然后没有分配。您可以通过重新分配-在循环内重新分配内存(在循环内一次重新分配1
char
)来解决这个问题。然后使用它。与其多次调用realloc
,不如为64
char
s分配内存,然后使用它存储结果。最后,可以通过另一个realloc
调用来释放剩余的空间
您不需要强制转换malloc
的返回值(void*
到char*
的转换是隐式完成的)。
您没有检查malloc
的返回值malloc
可能返回NULL
,在这种情况下,您必须单独处理。例如:-
#define NBITS 64
...
...
bits = malloc(NBITS);
if( bits == NULL ){
perror("malloc failed");
exit(EXIT_FAILURE);
}
注意:引入64幻数时,考虑到无符号long long
至少是64
位。因此,在转换时,我们将使用它,以防位数超过64
,我们将重新分配。更好的选择是使用chux所说的数字字符大小
也
我们将输入ascii值,然后您可以这样打印它
printf("%c", bits[i]);
您忘记释放分配的内存。如果不释放它(free(bits)
),就会出现内存泄漏
David C.Rankins评论将
int
替换为int64\u t
以使用64位而不是32位。将int
替换为int64\u t
以使用64位而不是32位
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替换int以使用64位而不是32位。
请尝试一下,让我们知道
答案很简单,
用int64替换int以使用64位而不是32位。
请尝试并让我们知道O/T:
malloc(sizeof(char))
只分配一个字符的内存,这可能不是您想要的代码>-->bits=malloc(数字大小*字符位)代码>由于您不返回位
,因此不需要动态分配任何内容。如果您只想将二进制表示形式打印到stdout
,只需传递uint64\u t digit
,设置您的size\u t size=sizeof digit*CHAR\u位然后是while(大小--)putchar((数字>>大小&