C:当值任意大时,将字符串转换为数字
据我所知,在C语言中,所有的数字类型都有一个固定的上限。因此,要将字符串转换为数字,您必须知道数字可能有多大C:当值任意大时,将字符串转换为数字,c,C,据我所知,在C语言中,所有的数字类型都有一个固定的上限。因此,要将字符串转换为数字,您必须知道数字可能有多大 有没有办法将字符串转换成数字而不限制数字的大小?重要的是,我关心的数字是负数。核心C语言只支持一定大小的整数。将十进制(文本)数转换为二进制(机器)数的常用功能是一系列函数1,正如您可能已经注意到的,它们要求您为预期的输入选择一个大小合适的整数类型。通常,当用C语言编程时,可以说您的程序只需要能够支持某个固定范围内的数字,如果您收到的输入超出该范围,则只需发出一个错误 如果您确实需要支持
有没有办法将字符串转换成数字而不限制数字的大小?重要的是,我关心的数字是负数。核心C语言只支持一定大小的整数。将十进制(文本)数转换为二进制(机器)数的常用功能是一系列函数1,正如您可能已经注意到的,它们要求您为预期的输入选择一个大小合适的整数类型。通常,当用C语言编程时,可以说您的程序只需要能够支持某个固定范围内的数字,如果您收到的输入超出该范围,则只需发出一个错误 如果您确实需要支持任意大的2个数字,那么您需要一个附加库。这些库的通用术语是“bignum”、“多精度算术”和“任意精度算术”。有一个编写良好、免费许可的bignum库 1相关的
ato*
和*scanf
功能按设计破坏-切勿将其用于任何用途。它们被破坏的一个原因是,它们使您无法判断何时收到了超出支持范围的输入
2在绝对值中,即在任意方向上远离零的任意距离这是我的尝试,我使用的最大值为64位int(但您可以将类型更改为您喜欢的任何类型),偏移量为8,这意味着如果超过8位(例如257),它将输出16位,如果超过16位,它将输出24位。。。等等,我还使用第一位作为符号位1表示负数,0表示正数
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <math.h>
void btd(int64_t num , char* res);
int act_size(int64_t num);
int main(void)
{
char res[64];
btd(-200 , res);
printf("%s\n" , res);
}
void btd(int64_t num , char* res)
{
int64_t tmp;
int neg = 0;
int size = 0;
int64_t one_check;
int i;
if(num < 0)
neg++;
if(num < 0)
tmp = num * -1;
else
tmp = num;
size = act_size(tmp);
one_check = pow(2 , size - 1);
printf("size %d\none flag : %ld\n" , size , one_check);
for( i = 0 ; i < size + 1; i++)
{
if(!i)
{
if(neg)
{
neg = 0;
res[0] = '1';
num <<= 1;
}
else
{
res[0] = '0';
num <<= 1;
}
continue;
}
if(tmp & one_check)
{
res[i] = '1';
tmp <<= 1;
}
else
{
res[i] = '0';
tmp <<= 1;
}
}
res[i] = '\0';
}
int act_size(int64_t ar)
{
int count = 1;
int last_one;
int size;
int64_t num = ar;
if(num < 0)
num *= -1;
while(num)
{
printf("NUM : %ld\n" , num);
if(num & 1)
{
last_one = count;
num >>= 1;
}
else
num >>=1;
count++;
}
printf("NUM : %ld\nLAST : %d\n" , num , last_one);
if(last_one <= 8)
return 8;
else if (last_one <= 16)
return 16;
else if (last_one <= 24)
return 24;
else if (last_one <= 32)
return 32;
else if (last_one <= 40)
return 40;
else if (last_one <= 48)
return 48;
else if (last_one <= 56)
return 56;
else
return 64;
}
最大整数=2^32。。。这算不算假设你没有得到工作。实际上,这要求的是现成的代码——“太宽了”。你的意思是真正的任意精度吗?例如,您是否希望将100+十进制数字的负数转换为二进制表示形式?请指定输入类型和输出类型。输入类型为整数,输出可能为字符串
NUM : 200
NUM : 100
NUM : 50
NUM : 25
NUM : 12
NUM : 6
NUM : 3
NUM : 1
NUM : 0
LAST : 8
size 8
one flag : 128
111001000