模拟实现abs()

举报
芒果_Mango 发表于 2022/01/10 23:30:23 2022/01/10
【摘要】 abs()库函数原型返回类型:int引用头文件:#include<stdlib.h>或者#include<math.h> 作用作用:求一个数的绝对值 实例#include<stdio.h>#include<math.h>int main(){ int n1 = -1; double n2 = -3.14; printf("%d %d", abs(n1), abs(n2)); return ...

abs()库函数原型

在这里插入图片描述

  • 返回类型:int

  • 引用头文件:#include<stdlib.h>或者#include<math.h>


作用

  • 作用:求一个数的绝对值

实例

#include<stdio.h>
#include<math.h>
int main()
{
	int n1 = -1;
	double n2 = -3.14;
	printf("%d %d", abs(n1), abs(n2));
	return 0;
}

在这里插入图片描述
参数不是int类型,而是其它类型,虽然可以通过,但是会报警告
在这里插入图片描述


模拟实现abs()函数


思路

基础知识1.
首先: tmp = n >> 31

若n为正数:tmp的结果为0

若n为负数:tmp的结果为-1


基础知识2

算术右移 -当前VS2019:采取的是算术右移,右边舍弃,左边补符号位0
最高位为符号位 正数:0 负数:-1
所以如果是正数:最高位为0,右移补符号位0
右移31位结果:00000000 00000000 00000000 00000000 ->0
如果是负数 :最高位为1,右移补符号位1
右移31位结果:11111111 11111111 11111111 11111111 ->-1
补码为全1序列 10进制代表的值为-1


代码

int my_pow(int n)
{
    int tmp = n >>31;	//正数:tmp = 0  负数:tmp = -1
    return (n ^ tmp) - tmp;
}
int main()
{
    int n = 0;
    scanf("%d",&n);
    int ret = my_pow(n);
    printf("%d\n",ret);
    return 0;
}

代码分析

    int tmp = n >>31;	//正数:tmp = 0  负数:tmp = -1
    return (n ^ tmp) - tmp;

  • 若n为正数:tmp = 0 n ^tmp 还是n ( 因为0^a = a )
    n^tmp - tmp = n - 0 = n**

  • 若n为负数: tmp = -1
    结论:==-n ^ -1 = n-1== 无论n为任意实数(包括0,正负数都满足)
    所以 n^tmp - tmp = n


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。