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

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

天行健,君子以自强不息

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  219 随笔 :: 0 文章 :: 587 评论 :: 46万 阅读
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

  最近学习要用到求绝对值函数,看了一下有很多种的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   volcanol  阅读(925)  评论(1编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
volcanol ----View OF Linux Can Appreciate Nature OF Linux。
点击右上角即可分享
微信分享提示