short((value == short(value))? value:(value>>31)^0*7fff)的意思

今天上课老师提了一个问题,让讲解一下这个函数的意思。

static inline short what_meaning(int value){

return short((value == short(value))? value:(value>>31)^0*7fff);

}

讲解:

int为32位有符号数。

如果输入的value处于short的范围(即-32768~32767),则value == short(value)为true,返回value原值。

如果输入的值超出范围,那么value == short(value)为false,则返回(value>>31)^0*7fff)。

如果value>32767,进行31位右移后,全为0即(0*0000)。

如果value<-32768,进行31位右移后,全为1即(0*ffff)。

(右移分为逻辑右移和算数右移,计算机只进行算数右移,对于有符号数来说,右移左边空出的补符号位。)

0*0000与0*7fff异或为0*7fff即32767,0*ffff与0*7fff异或为0*8000即-32768

所以这个函数的作用就很明显了:如果value处于-32768~32767则返回原值,如果超过,则返回边界值。

目的:

这样做更快。以后只要是和二的指数相关乘除运算都要用移位代替。

 

short为16位有符号数,十进制范围为:-32768~32767

计算机用0*0000到0*7FFF依次表示0到32767的数,剩下的0*8000为-32768,而从0*8001到0*FFFF依次表示-32767到-1的数。(注意计算机是用补码表示负数的,比如16进制为0*8001,转化为原码为0*ffff,转化为10进制就为-32767)稍加注意你会发现,二进制的第一位是用来表示正负号的,0表示正,1表示负。这里有一个问题:0本来既不是正数,也不是负数,但它占用了0*0000的位置,因此有符号的整数类型范围中正数个数比负数少一个。对一个有符号的数进行not运算后,最高位的变化将导致正负颠倒,并且数的绝对值会差1。也就是说,not a实际上等于-a-1。这种整数储存方式叫做“补码”。

节选自:https://blog.csdn.net/u013007900/article/details/24835475

 

问:如果用0*8000表示-32768而0*1001 0000也表示-32768这样不也是不浪费吗?

答:不浪费,因为针对16位来说,0*1000表示-32768,16位是无法达到0*10000的,而针对32位来说,0*1001 0000表示的并不是-32768。

 

对于static inline

有static的,参考“静态成员函数”
无static的是非静态成员函数

inline是把函数展开为代码,避免函数调用开销,是为了加快运行速度,而不是加快编译速度

在现在的编译器优化面前,inline这个关键字你基本上可以认为是多余的,至少别被它分心

以上节选自:https://bbs.csdn.net/topics/380095201

也可以参考:https://blog.csdn.net/qq_33160790/article/details/63255197

我当时没看懂不懂,所以来这里记录一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值