qq1242009750 发表于 2016-7-11 11:18:03

atoi的问题

#include <stdio.h>
#include <stdlib.h>

int main()
{
      printf("%d\n", atoi("123456789999999999"));

      return 0;
}

什么情况 这是溢出了吗??

无符号整形 发表于 2016-7-11 12:19:24

应该是的,int类型一般是16位的,但也有可能是32位的。

人造人 发表于 2016-7-11 12:35:02

本帖最后由 人造人 于 2016-7-11 12:36 编辑

123456789999999999
这个数太大了,需要 unsigned long long 类型才能存放
标准库中只有这些吗?
_CRTIMP double __cdecl __MINGW_NOTHROW        atof        (const char*);
_CRTIMP int __cdecl __MINGW_NOTHROW        atoi        (const char*);
_CRTIMP long __cdecl __MINGW_NOTHROW         atol        (const char*);

我们看来需要一个可以转换 unsigned long long 类型的函数
我自己写了一个
#include <stdio.h>
#include <string.h>

unsigned long long my_atol(char const *str) // 名字可能需要换一个,因为是转换到 unsigned long long 类型
{
        unsigned long long ret = 0;
        int str_len = strlen(str);
        int i = 0;
       
        str_len--;
       
        while(1)
        {
                char current = str;
               
                ret = ret * 10 + (current - '0');
               
                if(i == str_len)
                {
                        break;
                }
               
                i++;
        }

        return ret;
}

int main()
{
        printf("%llu\n", my_atol("1234567899999999997"));

      return 0;
}

qq1242009750 发表于 2016-7-11 13:41:53

人造人 发表于 2016-7-11 12:35
123456789999999999
这个数太大了,需要 unsigned long long 类型才能存放
标准库中只有这些吗?


看不懂。。。。。。

无符号整形 发表于 2016-7-11 14:07:56

你可以用_LARGE_INTEGER(大整数)来存放,上限是16E
页: [1]
查看完整版本: atoi的问题