免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: _google
打印 上一主题 下一主题

[C] HELP!我是C新手,看到两个oracle的C语言面试题 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2007-01-12 16:36 |只看该作者
如果考虑负数的话换最后一句

  1. long strtoint(const char *ptr)
  2. {
  3.     long len,res,val=1;
  4.     for(len=strlen(ptr);len--&&ptr[len]>='0'&&ptr[len]<='9';val*=10)
  5.          res+=val*(ptr[len]-'0');
  6.     return (len>0)? (-1):(len<0)?res:(ptr[len]=='-')?(~res+1):-1;
  7. }
复制代码

评分

参与人数 1可用积分 +3 收起 理由
langue + 3

查看全部评分

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
42 [报告]
发表于 2007-01-12 16:45 |只看该作者
原帖由 phantomblue 于 2007-1-11 10:10 发表
第一题只能用异或来做,用加减得没有考虑到溢出的问题.

错误的.

如果相加有overflow, 那么相减的时候就会发生underflow. 所以溢出就抵消了.

论坛徽章:
0
43 [报告]
发表于 2007-01-12 21:22 |只看该作者
原帖由 icytear 于 2007-1-11 11:23 发表
int c_atoi(char *s, int *err)
{
        int i, sum=0;
        for ( i= s!=NULL? s[0]=='-' ? 1 : 0 : 0; (s!=NULL) && (s>='0') && (s<='9'); i++)
                sum =  ...

循环中s一直没变啊

论坛徽章:
0
44 [报告]
发表于 2007-01-14 11:53 |只看该作者
any more ?

论坛徽章:
0
45 [报告]
发表于 2007-01-14 12:13 |只看该作者
原帖由 koolcoy 于 2007-1-12 16:45 发表

错误的.

如果相加有overflow, 那么相减的时候就会发生underflow. 所以溢出就抵消了.

如果是signec类型,溢出是未定义行为,此时肯定不能用加减做;
如果是unsigned类型,由于溢出规则是有定义的(取模运算),而取模运算可以保证溢出取模后的计算结果与不取模的计算结果一致,所以此时可以用加减来计算。

例如:
unsigned char a = 255;
unsigned char b =1;

如果用:
a = a + b;
b = a - b;
a = a - b;
来计算,那么
第一步:a = 255 + 1 =0 (256 mod 256)
第二步:b = 0 - 1 = 255 (= 256 - 1)
第三步:a = 0 - 255 = 1 (= 256 - 255)
此时就交换了a和b

[ 本帖最后由 tyc611 于 2007-1-14 12:16 编辑 ]

论坛徽章:
0
46 [报告]
发表于 2007-01-14 12:17 |只看该作者
有点意思,加精做个保留。

论坛徽章:
0
47 [报告]
发表于 2007-01-14 16:31 |只看该作者
原帖由 converse 于 2007-1-14 12:17 发表
有点意思,加精做个保留。

禁止灌水

PS:偶是来学习的

论坛徽章:
0
48 [报告]
发表于 2007-01-14 16:45 |只看该作者
这样写不犯法,且清晰

  1.         __asm
  2.         {
  3.                 push a;
  4.                 push b;
  5.                 push c;
  6.                 pop b;
  7.                 pop a;
  8.                 pop c;
  9.         }
复制代码

论坛徽章:
0
49 [报告]
发表于 2007-01-14 16:48 |只看该作者
原帖由 huntrsky 于 2007-1-14 16:45 发表
这样写不犯法,且清晰

  1.         __asm
  2.         {
  3.                 push a;
  4.                 push b;
  5.                 push c;
  6.                 pop b;
  7.                 pop a;
  8.                 pop c;
  9.         }
复制代码


算你狠

论坛徽章:
0
50 [报告]
发表于 2007-01-14 16:54 |只看该作者

回复 49楼 converse 的帖子

是编译器狠才对哈
溢出问题也解决了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP