据我所知,在C中,所有数字类型都有固定的上限。因此,要将字符串转换为数字,您必须知道该数字可能有多大。
有没有办法将字符串转换为数字,而对数字的大小设置任何限制?如果重要,我关心的数字是否定的。
答案 0 :(得分:2)
核心C语言仅支持一定大小的整数。用于将十进制(文本)数字转换为二进制(机器)数字的库存工具是strto*
函数系列 1 ,并且您可能已经注意到,它们要求您选择适当的您期望的输入的大小整数类型。通常,在用C编程时,可以说你的程序只需要能够支持某个固定范围内的数字,如果你收到超出该范围的输入,就会引发错误。
如果您真的需要支持任意大的 2 号码,那么您需要一个附加库。这些库的一般术语是“bignum”,“多精度算术”和“任意精度算术”。一本写得很好,自由许可的bignum图书馆是GNU MP。
1 相关的ato*
和*scanf
函数按设计被破坏 - 从不将它们用于任何事情。它们被打破的方法之一是它们无法判断您何时收到支持范围之外的输入。
2 ,即在任一方向上任意远离零
答案 1 :(得分:1)
这是我的尝试,我使用最大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;
}
这个的输出将是(因为我们给它-200作为参数)
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