首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C中将划时代的小数时间转换为64位二进制,然后再转换为小数

如何在C中将划时代的小数时间转换为64位二进制,然后再转换为小数
EN

Stack Overflow用户
提问于 2014-09-15 19:04:12
回答 1查看 474关注 0票数 0

我正在尝试创建一个脚本,它将根据指定的大小将小数转换为二进制,然后反转这个过程,即从二进制到十进制。到目前为止,从我的角度(初学者)来看,脚本和输出看起来都是正确的。我可以把所有的数字从十进制转换成二进制,反之亦然。我是最后一部分的堆栈,我试图把划时代的时间从64位二进制数转换成十进制。我不明白我在哪里出了问题,因为其余的数字似乎都已正确恢复。我发现所使用的脚本的源点是二进制到十进制十进制到二进制

更新:将代码修改为短版本:

我已经修改了代码,以简单地演示这个问题。该代码的工作效率高达32位二进制转换。但由于我需要转换多达64,我不知道如何做到这一点。我注意到,因为我在int之前使用,所以达到了32位的最大限制,所以我将其修改为long long int,以达到64位。

我提供了一个简单的小数点转换为32位格式的1和64的例子来说明这个问题。时代时间是所需的输出,但在尝试转换之前,我需要验证代码是否工作。

代码样本:

代码语言:javascript
复制
#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位转换输出样本:

代码语言:javascript
复制
LI: 00000000000000000000000000000001
Final_LI: 1

64位转换的输出样本:

代码语言:javascript
复制
LI: 0000000000000000000000000000000100000000000000000000000000000001
Final_LI: -1
EN

回答 1

Stack Overflow用户

发布于 2014-09-16 13:13:24

  1. 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';返回指针};
  2. 简化binary_decimal()。再次使用未签名的数学,删除pow() /*函数将二进制转换为十进制。*/无符号长binary_decimal(无符号长int n) {无符号长小数= 0;而(n != 0) {十进制*= 2;十进制+= n% 10;n /= 10;}返回十进制};
  3. 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25855073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档