【算法和数据结构】_12_小算法_abs_fabsf_fabsd_大端小端判断

  最近学习要用到求绝对值函数,看了一下有很多种的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;

}

  测试结果如下图所示:

  【算法和数据结构】_12_小算法_abs_fabsf_fabsd_大端小端判断

你可能感兴趣的:(数据结构)