#include<stdio.h>
#include<stdlib.h>
unsigned int *bin(int);
int main(void)
{
unsigned int n=0,*i=NULL;
printf("Enter no:");
scanf("%d",&n);
i=bin(n);
printf("Binary no: %d\n",*i);
return 0;
}
unsigned int *bin(int n)
{
unsigned int i=0,j=0;
static unsigned int *result=NULL;
result=(unsigned int*)malloc(1*sizeof(unsigned int));
printf("Result=%p\n",result);
j=(unsigned int)result;
for(i=(1<<31);i>0;i=(i>>1))
{
if(n & i)
{
*result=1;
result++;
}
else
{
*result=0;
result++;
}
}
result=(unsigned int*)j;
printf("Result=%p\n",result);
return result;
}
Output :
Enter no:6
Address of Result=0x2576010
Address of Result=0x2576010
Binary no: 0
该程序的目的是将十进制数转换为二进制数。主要功能是调用bin()函数将十进制转换为二进制。
代码逻辑: - 让我们取无符号整数(32位),它由0-31位组成。要打印无符号整数的二进制表示,从第31位开始,检查第31位是ON还是OFF,如果是ON则打印“1”否则打印“0”。现在检查第30位是ON还是OFF,如果是ON打印“1”,否则打印“0”,对31到0的所有位执行此操作,最后我们将得到数字的二进制表示。
我很困惑应该使用malloced多少空间来存储32位整数。如何释放分配给result的内存。请帮我解决这个问题。
答案 0 :(得分:2)
考虑到数据类型1和0为char,您需要分配32字节(至少)的内存来存储对应于n中每个位的1或0。此外,我建议将int作为数据类型并分配32x4(字节)的内存。这可能是你的最终代码应该是这样的:
#include<stdio.h>
#include<stdlib.h>
unsigned int *bin(int);
int main(void)
{
unsigned int n=0,*result =NULL;
printf("Enter no:");
scanf("%d",&n);
result =bin(n);
printf ("binary representation is: ");
int i;
for ( i=0;i<32;i++)
printf("%d ",result[i]);
free(result);
return 0;
}
unsigned int *bin(int n)
{
unsigned int i=0;
static unsigned int *result=NULL;
result=(unsigned int*)malloc(32*sizeof(unsigned int));
printf("Result=%p\n",result);
unsigned int* j=NULL;
j=result;
for(i=(1<<31);i>0;i=(i>>1))
{
if(n & i)
{
*j=1;
j++;
}
else
{
*j=0;
j++;
}
}
return result;
}
答案 1 :(得分:1)
Shubham,我真的认为你的方向错误,因为首先没有十进制或二进制整数这样的东西。我建议你使用malloc
和没有static
指针来解决你的问题:
/*
* return a 32-bit long binary string from 'integer'
* this string is dynamically allocated (malloc)
* return NULL in case of error (so DON'T free it in this case)
*/
char* bin(long integer)
{
char* pChResult=malloc(33*sizeof(char));
char* pCh;
unsigned long i;
if(pChResult!=NULL) {
for(pCh=pChResult, i=1<<31; i>0; pCh++, i>>=1) {
if(i&integer)
*pCh='1';
else
*pCh='0';
}
*pCh='\0';
}
return(pChResult);
}
你的主人也会很轻松:
int main(void)
{
unsigned int n;
char* result;
printf("Enter no:");
scanf("%d",&n);
result = bin(n);
if(result==NULL)
{
fprintf(stderr, "internal error!\n");
return(-1);
}
printf("binary representation is: %s\n", result);
free(result);
return(0);
}
答案 2 :(得分:0)
32位积分值强制使用signed long
或unsigned long
在功能bin
中,只需在存储结果时使用*result
然后return(result);
主要使用*result
以及free(result);
完成结果时
为什么不简单地unsigned long bin(long);
?
最后,你的功能绝对没有!应该是void bin(long, char[33]);
(不需要malloc
)或char* bin(long);
(带malloc
)