深入分析兼容类型间的类型转换问题

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而不是像补码一样扩展最高有效位得数字)

 

 

至此,我们可以深入理解了类型转换下得具体转化原理。

 

posted @ 2016-12-29 21:38  rurui  阅读(482)  评论(0编辑  收藏  举报