博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
atol 函数
阅读量:6432 次
发布时间:2019-06-23

本文共 1464 字,大约阅读时间需要 4 分钟。

代码:

1 long __cdecl atol( 2   const char *nptr 3   ) 4 { 5   int c; /* current char */ 6   long total; /* current total */ 7   int sign; /* if '-', then negative, otherwise positive */ 8  9   /* skip whitespace */10   while ( isspace((int)(unsigned char)*nptr) )11   ++nptr;12 13   c = (int)(unsigned char)*nptr++; sign = c; /* save sign indication */14   if (c == '-' || c == '+')15   c = (int)(unsigned char)*nptr++; /* skip sign */16 17   total = 0;18 19   while (isdigit(c)) {20   total = 10 * total + (c - '0'); /* accumulate digit */21   c = (int)(unsigned char)*nptr++; /* get next char */22   }23 24   if (sign == '-')25   return -total;26   else27   return total; /* return result, negated if necessary */28 }

为什么要用 (int)(unsigned char)?

因为在char 类型强制转换成int类型时,若char类型数是负数(最高位为1)有些编译器会将最高字节填充0xFF

1 for(int i = 128; i < 131; i++) 2     { 3         int c = (char)i; 4         int d = (unsigned char)i; 5         printf("%d %d\n", c, d); 6     } 7  8 输出: 9 -128 12810 -127 12911 -126 13012 请按任意键继续. . .

因为isspace(),isdigit()这类函数接受一个int 参数,参数的值必须是一个可以用unsigned char 表示的值或者是EOF,以下是 man 手册的原文:

int isspace(int c);
int isdigit(int c);
...
These functions check whether c, which must have the value of anunsigned char or EOF,falls into a cetern charcter class according to the current locale.
所以需要用c = (int)(unsigned char)*nptr++,来确保从 *nptr++ 到 c 是进行零扩展而不是符号扩展,保证 c 中存放的是一个unsigned char 所能表示的值。

 

转载于:https://www.cnblogs.com/xubin0523/archive/2012/10/15/2724185.html

你可能感兴趣的文章
C++基础算法学习——猜假币
查看>>
1039. 到底买不买(20)
查看>>
K - Kia's Calculation (贪心)
查看>>
android笔试题一
查看>>
【JavaEE企业应用实战学习记录】getConnListener
查看>>
了解轮询、长轮询、长连接、websocket
查看>>
bzoj2427[HAOI2010]软件安装
查看>>
bzoj1593[Usaco2008 Feb]Hotel 旅馆*
查看>>
WPF个人助手更新
查看>>
NLPIR技术助力中文智能数据挖掘
查看>>
python操作redis--------------数据库增删改查
查看>>
Android中仿IOS提示框的实现
查看>>
php初学第一课
查看>>
Windows下与Linux下编写socket程序的区别 《转载》
查看>>
java学习笔记 --- IO(3)
查看>>
Mysql 的FIND_IN_SET函数慢的忧化
查看>>
Web service是什么?
查看>>
python 问题集合
查看>>
豌豆荚工程师谈其新版应用搜索技术
查看>>
螺旋阵(递归和非递归)
查看>>