将一个输入的int型数值转换到short范围内

代码如下

static inline short convert(int value)
{
return short((value =https://www.it610.com/article/= short(value)) ? value:(value>>31)^Ox7FFF);
}
本题目基于32位的机器,代码的意思很容易理解,就是输入一个值,然后经过那一个式子运算之后,返回一个值,只是其中运算的部分比较有意思。这其中涉及到两种数据类型,一种是int型:32位,表示范围在 -2147483648(-2^31)~2147483647(2^31-1);另外一种short型:16位,表示范围在-32768(-2^15)~32767(2^15-1)之间。
输入:
一个int型的数值
【将一个输入的int型数值转换到short范围内】运算:
返回值的式子是一个三目运算符,按理来说结果应该分两种情况,但是事实上应该分三种情况来考虑,具体请看下文:
(1) 第一种情况:
当输入的值就是一个short范围内的值,即输入的值在-32768~32767之间时,可以看出,这时候直接将这一个值转化为short型的数据直接返回。
(2) 第二种情况:
当输入的值不再short能表示的范围之内,则要执行后面的转换操作,此时又分一下两种情况来考虑:
第一:当输入的值在负数范围内超过了short范围,什么意思呢?就是说输入的这个值在 [ -2147483648,-32768 ] 之内,这时候来进行后面的计算,为了方便说明问题,我们举一个在这个范围之内的数字来进行相应的运算。
假如输入值为:-32769,进行后面相关的计算和转化,以此来说明问题。因为后面的操作是向右进行算术右移,所以我们将这个数化为二进制数:


将一个输入的int型数值转换到short范围内
文章图片


由以上计算过程可知,-32369转化为二进制之后为:1111 1111 1111 1111 0111 1111 1111 1111 ,之后将这个二进制数算术右移31位,算术右移的意思就是将除了符号为之外的所有值向右移动一位,最高位补上与符号为相同的数,比如本例中由于是负数,符号位为1,因此右移之后就在最高位补上一个1,依此类推,最后得到的值为:1111 1111 1111 1111 1111 1111 1111 1111,接下来与后面的十六进制数 Ox7FFF(Ox表示十六进制)进行异或,7FFF化为二进制为0111 1111 1111 1111,这里要说明一点,由于函数最后的返回值为short型的,只有16位,因此只需要对低16位进行异或即可, 后面根据异或的规则:相同为0,相异为1,进行异或,结果如下:


将一个输入的int型数值转换到short范围内
文章图片


很显然,最后是返回-32768,现在已经可以看出规律了,当负数的值在小于-32768的范围内的时候,通过后面的一系列计算之后就得到short型所能表示的最小负数。虽然我们上面只是举了一个实例来进行说明,但是我们想一下,在int型的负数中,只要是超过了short的表示范围,就会进行后面的转换和运算,其中有一个算术右移31位的操作,因此不管之前的值是多少,右移之后的结果都是一样的,自然异或的结果也是相同的了,所以在 [ -2147483648,-32768 ] 之间的负数通过这个函数计算之后的结果都会变成-32768。
第二:与上面的原理相同,当一个正数超过了short能表示的范围之后,即当这个整数属于[ 32767, 2147483647 ] 的时候,也需要进行后面的一系列操作。
为了方便计算,这里我们就用32768来作为例子进行说明,同样的,我们首先将32768化为二进制数,很显然二进制数为2^15,即:01000 0000 0000 0000,此时的数已经是32位的了,因此前面的位数全部补上符号位,即为 0000 0000 0000 0000 0100 0000 0000 0000,同样的道理,算术右移31位,之后得到的结果后16位为 0000 0000 0000 0000,与Ox7FFF异或之后结果为:0111 1111 1111 1111也就是7FFF,它也就是short型能表示的最大数32767,到这里你应该明白了。
返回值:
一个short类型的数值
所以最后的结论就是,函数得到一个int类型的输入,当这个值在short能表示的范围之内的话,就直接范围short型这个值,如果这个数是超过了short表示范围的值的话分两种情况:
(1)若为负数,则返回short型能表示的最小负数-32768(-2^15);
(2)若为正数,则返回short型能表示的最大正数32767(2^15-1)。
PS:这是一道个人觉得很有意思的一个题目,以上内容为自己总结整理的,如果文中有错误或者不足的地方,欢迎大家批评指正。

    推荐阅读