Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 发出将双量程数字转换为二进制的命令_C - Fatal编程技术网

C 发出将双量程数字转换为二进制的命令

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;

我有一个问题,将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;
        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((数字>>大小&