zoukankan      html  css  js  c++  java
  • 深入分析兼容类型间的类型转换问题

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

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

  • 相关阅读:
    php环境配置中各个模块在网站建设中的功能
    PHP+Apache+MySQL+phpMyAdmin在win7系统下的环境配置
    August 17th 2017 Week 33rd Thursday
    August 16th 2017 Week 33rd Wednesday
    August 15th 2017 Week 33rd Tuesday
    August 14th 2017 Week 33rd Monday
    August 13th 2017 Week 33rd Sunday
    August 12th 2017 Week 32nd Saturday
    August 11th 2017 Week 32nd Friday
    August 10th 2017 Week 32nd Thursday
  • 原文地址:https://www.cnblogs.com/rurui/p/6234891.html
Copyright © 2011-2022 走看看