volcanol的工控博客
Email : lilinly225@126.com 索要资料加QQ 点击进入 或 点击左侧的资料分享专用帖

volcanol ---- View OF Linux Can Appreciate Nature OF Linux

天行健,君子以自强不息

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  最近学习要用到求绝对值函数,看了一下有很多种的abs函数,因此想自己实现这些代码。

下面是我进行测试的代码:

#include <stdio.h>

typedef unsigned int U32,u32;
typedef enum {FALSE,TRUE} BOOL;

//求绝对值函数
float fabsf(float x) 
{
    //这里可以看到浮点数和整数在计算机中的表达方式不一样
    //下面的这种方法,不能用于整数
    U32* p;

    p=(U32 *)&x;
    *p=*p & 0x7FFFFFFF;

    return x;
}

int abs(int x) 
{
    //负数的补码=反码+1=~源码+1 ;这个公式仅是对绝对值有效,
    //而符号位无关
    /*
    if( x & 0x80000000 )
        return ~(--x);
    else
        return x;
    */

    //或者用下面的方法
    return   ( x & 0x80000000 ) ? ~(--x) : x ;

    /*
    或者用下面的方法
    return  x>=0 ? x:(-1*x) ;
    */
    
}

double fabsd(double x)
{
    /*
     *因为double的sizeof(double)=8,
     *所以处理需要技巧
     *这里我们可以利用char*指针进行处理
    */
    /*
    unsigned char* p;

    p = (unsigned char*)&x;
    p=p+7;
    *p=*p & 0x7F;

    return x;
    */

    //也可以用下面的方法
    if(x<0)
        return -1*x;

    return x;

}

BOOL isLittleEndian()
{
    /*可以用下面这种方法实现
    U32 x=0x12345678;
    unsigned char *p;

    p=(unsigned char*)&x;
    if(!(*p ^ (unsigned char)0x78))
        return TRUE;
    else   //这里的else分支,其实可以不用
        return FALSE;
     */

    //也可以利用下面的方式实现
    union 
    {
        unsigned char x;
        unsigned int  y;
    }a;

    a.y=(unsigned int)0x78;
    if(!(a.x^(0x78)))
        return TRUE;
    else  //这里的else分支,其实可以不用
        return FALSE;
}


int main()
{
    double x=fabsf(-123.0);
    U32 y=0x12345678;
    unsigned char *p;


    printf("fabsf(-123.0)=%f,sizeof(double)=%d",x,sizeof(double));
    printf("\nabs(x)=%d",abs(-4));
    printf("\nfabsd(x)=%f",fabsd(-300.123));

    p=(unsigned char*)&y;
    printf("\n%x",*p);
    if(isLittleEndian())
    {
        puts("\nYes");
    }

    getchar();
    return 0;
}

  测试结果如下图所示:

  

posted on 2013-10-08 13:55  volcanol  阅读(912)  评论(1编辑  收藏  举报
volcanol ----View OF Linux Can Appreciate Nature OF Linux。