最近学习要用到求绝对值函数,看了一下有很多种的abs函数,因此想自己实现这些代码。
下面是我进行测试的代码:
#includetypedef 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;}
测试结果如下图所示: