今天上课老师提了一个问题,让讲解一下这个函数的意思。
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
我当时没看懂不懂,所以来这里记录一下