1.本文以C语言为例,用short与int类型来分析两者之间的类型转换问题
2.本文只分析相兼容类型之间的类型转换问题
在日常撸码中我们在相兼容类型之间会遇到两种转型方式,第一是强制类型转换,其次是隐式类型转换,此文将以二进制代码分析两种转型的具体实现。
1.强制类型转换
提到强制类型转换需引入一个概念:截断数字。
我们以以下一段代码解释:
int x=53191; short y=(short)x;
在C语言中short类型为2个字节,占位16位,其表达范围为(-32768~32767);
而int类型为4个字节,占位32位,其表达范围位(-2147483648~2147483647);
x=53191显然超出了short类型的表达范围,那么是如何完成强制转型的呢?这就用到了截断数字:
53191的二进制表达为:0000 0000 0000 0000 1100 1111 1100 0111
而short类型只有16位,从而我们应该截掉53191的高16位
结果为:1100 1111 1100 0111
注意此结果为补码形式,再把此二进制转化为十进制形式,其方法为:y=-1*2^15+1*2^14+1*2^11+1*2^10+1*2^9+1*2^8+1*2^7+1*2^6+1*2^2+1*2^1+1
求得y=-12345
此为兼容类型间强制类型转换的原理(注:此例以补码形式,也就是有符号数来举例,无符号数的强制类型转换原理相同可以自行推导得出)
2.隐式类型转换
我们以以下一段代码解释:
short x=-12345;
int y=x;
我们可以从此看出x转型为int并未使用强制类型转换符,这是因为int类型始终可以放得下short的位数。
我们可以得出x的二进制表示为:1100 1111 1100 0111
当我们转换为32位的int时,用x的最高位1补满16位,
得:1111 1111 1111 1111 1100 1111 1100 0111
此为隐式转型后的结果,我们把2进制代码转化为十进制代码得y=-12345,与原数据并无差异,这就是因为在short中得-12345在Int中可以放得下,
而不像强制类型转换那样必须截断数字。(本例也以补码形式证明,无符号数应扩展0而不是像补码一样扩展最高有效位得数字)
至此,我们可以深入理解了类型转换下得具体转化原理。