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

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

  • 相关阅读:
    浅谈python中selenium库调动webdriver驱动浏览器的实现原理
    浅谈python面向对象编程和面向过程编程的区别
    python中可变与不可变类型的全局变量
    冒泡排序和sort,sorted排序函数
    浅谈python之利用pandas和openpyxl读取excel数据
    configparser读取配置文件时的相对路径问题
    关于网站登录后的页面操作所携带的不同cookie值
    【转】Cookie和Session和Cache
    python输出九九乘法表
    win10系统使用小技巧【转】
  • 原文地址:https://www.cnblogs.com/rurui/p/6234891.html
Copyright © 2011-2022 走看看