| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2203 人关注过本帖
标题:数据类型的极值对运算的影响
只看楼主 加入收藏
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:0 
回复 9楼 广陵绝唱
if(m<0)
    {
        putchar('-');
        n*=-1;
    }
n=abs(m);


这里好像有点问题,n好像还没初始化就进行运算了,然后又立即使用n=abs(m);把之前的操作给覆盖了,好像这个过程没什么实际意义

[ 本帖最后由 zhddragon 于 2010-1-24 01:51 编辑 ]

身体是玩命的本钱
2010-01-24 01:49
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
回复 11楼 zhddragon
对不起,这是个函数, n 值是从主函数中传过来的.但我这条语句属实有些画蛇添足了,因为下面有个 abs 了.这是在 oj 时左改右改时忘了.呵,谢谢提醒.

    能帮我解答一下为什么 int 型不可以过而 unsigned 可以过吗?谢谢.一会我把原题发过来.
2010-01-24 01:53
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
原题:


题目描述:
编写一个NumConvert函数,要求声明为int NumConvert(int n, int k);
功能是把传入的参数n按照k进制进行转换并输出结果

输入:
按参数传递,2<=k<=36,n在int的范围内

输出:
按参数传递输入,通过标准输出,输出相应的结果
输出的结果应当不包含换行
如果超出10,应当用大写字母依次表示
函数执行成功则应当返回0值

样例输入:
2 2
9 4
31 16
-31 16

样例输出:
10
21
1F
-1F

其它:
请不要写上main函数

2010-01-24 01:54
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:70 
原因就是我在上面举得例子
如果你传入的m刚好等于0x8000(-32768)时你调用int n = abs(m)时,abs返回来的值依然是0x8000 (-32768) ,如果你获取这个值的数据类型依然是int型那么0x8000会被解释成-32768,在进行运算时这样n的值就不是你期望的32768,然后你进行除和求余的时候会得到一连串的负值,然后拿这一堆的负值去作为数组的下标,导致数组访问越界。如果你使用一个unsigned型那个0x8000依然会被解释为32768,与你期望的一致

[ 本帖最后由 zhddragon 于 2010-1-24 02:21 编辑 ]

身体是玩命的本钱
2010-01-24 02:17
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:0 
abs()虽然是一个标准库函数,但有一些库对它的实现没有考虑边界问题,这个函数在各种库的实现中普遍存在bug

做绝对值转换的时候要特别注意有符号数的正负数的取值范围不一致的问题

[ 本帖最后由 zhddragon 于 2010-1-24 02:28 编辑 ]

身体是玩命的本钱
2010-01-24 02:24
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
以下是引用Knocker在2010-1-23 20:00:21的发言:

#include <stdio.h>
#include   <limits.h>

main()
{
    int i   =    INT_MAX;
    int k =  INT_MIN;
    unsigned n = INT_MAX;

   printf("UINT_MAX = %u  INT_MAX = %d  INT_MIN = %d\n",UINT_MAX,INT_MAX,I ...
UINT_MAX = 4294967295  INT_MAX = 2147483647  INT_MIN = -2147483648
1.   n = 2147483647  i = 2147483647   k= -2147483648
2. n=abs(k)  n = 2147483648
3. i=abs(k)  i = -2147483648

Press any key to continue...


偶现在对楼主是否适宜学习C语言抱怀疑态度。。。。。。
收到的鲜花
  • 广陵绝唱2010-01-24 10:58 送鲜花  49朵   附言:谢谢指教.

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2010-01-24 09:43
gfb74003
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-2-8
收藏
得分:0 
  还没学到这个  `、、
2010-02-08 19:41
严行
Rank: 1
来 自:湖南
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-4-22
收藏
得分:0 
2010-04-22 14:51
飘少
Rank: 1
来 自:山东泰安
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-3-28
收藏
得分:0 
我是菜鸟,等我在学学就来帮你~~~~~

始终被模仿,从未被超越!
2010-04-23 22:36
快速回复:数据类型的极值对运算的影响
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017667 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved