Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:当值任意大时,将字符串转换为数字_C - Fatal编程技术网

C:当值任意大时,将字符串转换为数字

C:当值任意大时,将字符串转换为数字,c,C,据我所知,在C语言中,所有的数字类型都有一个固定的上限。因此,要将字符串转换为数字,您必须知道数字可能有多大 有没有办法将字符串转换成数字而不限制数字的大小?重要的是,我关心的数字是负数。核心C语言只支持一定大小的整数。将十进制(文本)数转换为二进制(机器)数的常用功能是一系列函数1,正如您可能已经注意到的,它们要求您为预期的输入选择一个大小合适的整数类型。通常,当用C语言编程时,可以说您的程序只需要能够支持某个固定范围内的数字,如果您收到的输入超出该范围,则只需发出一个错误 如果您确实需要支持

据我所知,在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