最近学习要用到求绝对值函数,看了一下有很多种的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(" abs(x)=%d",abs(-4)); printf(" fabsd(x)=%f",fabsd(-300.123)); p=(unsigned char*)&y; printf(" %x",*p); if(isLittleEndian()) { puts(" Yes"); } getchar(); return 0; }
测试结果如下图所示: