最近学习要用到求绝对值函数,看了一下有很多种的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; }
测试结果如下图所示:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步