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

时间:2023-11-17 19:34:32

  最近学习要用到求绝对值函数,看了一下有很多种的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<)
return -*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(-));
printf("\nfabsd(x)=%f",fabsd(-300.123)); p=(unsigned char*)&y;
printf("\n%x",*p);
if(isLittleEndian())
{
puts("\nYes");
} getchar();
return ;
}

测试结果如下图所示:

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