我正在尝试创建一个脚本,它将根据指定的大小将小数转换为二进制,然后反转这个过程,即从二进制到十进制。到目前为止,从我的角度(初学者)来看,脚本和输出看起来都是正确的。我可以把所有的数字从十进制转换成二进制,反之亦然。我是最后一部分的堆栈,我试图把划时代的时间从64位二进制数转换成十进制。我不明白我在哪里出了问题,因为其余的数字似乎都已正确恢复。我发现所使用的脚本的源点是二进制到十进制和十进制到二进制。
更新:将代码修改为短版本:
我已经修改了代码,以简单地演示这个问题。该代码的工作效率高达32位二进制转换。但由于我需要转换多达64,我不知道如何做到这一点。我注意到,因为我在int之前使用,所以达到了32位的最大限制,所以我将其修改为long long int,以达到64位。
我提供了一个简单的小数点转换为32位格式的1和64的例子来说明这个问题。时代时间是所需的输出,但在尝试转换之前,我需要验证代码是否工作。
代码样本:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <inttypes.h>
#define MAX_CHARACTERS 65
typedef struct rec {
char transmit[MAX_CHARACTERS];
char receive[MAX_CHARACTERS];
}RECORD;
char *decimal_to_binary(int n , int num); /* Define function */
char *decimal_to_binary(int n , int num) {
long long int c, d, count;
char *pointer;
count = 0;
pointer = (char*) malloc( num + 1 );
if ( pointer == NULL )
exit(EXIT_FAILURE);
for ( c = num - 1; c >= 0; c-- ) {
d = n >> c;
if ( d & 1 )
*( pointer + count ) = 1 + '0';
else
*( pointer + count ) = 0 + '0';
count++;
}
*( pointer + count ) = '\0';
return pointer;
}
int binary_decimal(long long int n); /* Define function */
int binary_decimal(long long int n) { /* Function to convert binary to decimal.*/
int decimal=0, i=0, rem;
while (n!=0) {
rem = n%10;
n/=10;
decimal += rem*pow(2,i);
++i;
}
return decimal;
}
int main(void) {
RECORD *ptr_record;
ptr_record = (RECORD *) malloc (sizeof(RECORD));
if (ptr_record == NULL) {
printf("Out of memmory!\nExit!\n");
exit(0);
}
int LI_d = 1;
char *LI_b = decimal_to_binary(LI_d,32);
memset( (*ptr_record).transmit , '\0' , sizeof((*ptr_record).transmit) );
strncat((*ptr_record).transmit , LI_b , strlen(LI_b) );
printf("LI: %s\n",(*ptr_record).transmit);
//transmit and receive
memset( (*ptr_record).receive , '\0' , sizeof((*ptr_record).receive) );
strncpy( (*ptr_record).receive , (*ptr_record).transmit , strlen((*ptr_record).transmit) );
char *LI_rcv_b = strndup( (*ptr_record).receive , 64 );
int LI_rcv_i = atoi (LI_rcv_b);
int final_LI = binary_decimal(LI_rcv_i);
printf("Final_LI: %i\n",final_LI);
free( ptr_record );
return 0;
}32位转换输出样本:
LI: 00000000000000000000000000000001
Final_LI: 164位转换的输出样本:
LI: 0000000000000000000000000000000100000000000000000000000000000001
Final_LI: -1发布于 2014-09-16 13:13:24
decimal_to_binary(int n, ...):最好使用无符号的数学
//char *decimal_to_binary(int n,int num) { char *decimal_to_binary(无符号的long n,int num) { // long int c,d,count;un符号长int d;int c,count;char *指针;count = 0;*decimal_to_binary= malloc(num + 1);//下拉强制转换if (指针==空)退出(EXIT_FAILURE);for (c = num - 1;c >= 0;{d=n >> c;if (d & 1) *(指针+计数)=1+ '0';否则*(指针+计数)=0+ '0';count++;}*(指针+计数)= '\0';返回指针};binary_decimal()。再次使用未签名的数学,删除pow()
/*函数将二进制转换为十进制。*/无符号长binary_decimal(无符号长int n) {无符号长小数= 0;而(n != 0) {十进制*= 2;十进制+= n% 10;n /= 10;}返回十进制};main()有很多问题
int (Void){ RECORD *ptr_record;ptr_record =malloc(sizeof of (RECORD));// drop cast if (ptr_record == NULL) {printf(“内存不足!\n退出!\n”);//拼写修复出口(0);} //使用无符号长长无符号长LI_d = 1;LI_d =(无符号长) -1;char *LI_b = decimal_to_binary(LI_d,32);((*ptr_record).transmit,'\0',sizeof( (*ptr_record).transmit);// strncat((*ptr_record).transmit,LI_b,strlen(LI_b));strncat((*ptr_record).transmit,LI_b,sizeof(*ptr_record).transmit)-1;printf("LI:%s\n",(*ptr_record).transmit);//发送和接收memset((*ptr_record).receive,'\0',sizeof((*ptr_record).receive);// strncpy((*ptr_record).receive,(*ptr_record).transmit,strlen(*ptr_record).transmit);strncpy((*ptr_record).receive,(*ptr_record).transmit,sizeof(*ptr_record).transmit)- 1);// char *LI_rcv_b =strn举((*ptr_record).receive,64);char *LI_rcv_b = strndup((*ptr_record).receive,MAX_CHARACTERS);//此时,方法出现错误//不能接受64位数字字符串并转换为典型的长长。// int LI_rcv_i = atoi(LI_rcv_b);// int final_LI = binary_decimal( LI_rcv_i );// printf("Final_LI:%i\n",final_LI);//怀疑您想要将64位二进制数字字符串转换为64位整数//可能通过使用binary_decimal -建议重写该函数(LI_rcv_b,NULL,2);printf("Final_LI:%llu\n",LI_rcv_i);空闲(Ptr_record);返回0;}输出
LI: 111111111111111111111111111111111111
Final_LI: 4294967295
https://stackoverflow.com/questions/25855073
复制相似问题