关于数据转换的一点思考

  学习《C++ Primer Plus》一段时日,第十五章末尾类型转换运算符部分讲到C++针对类型安全转换而设置的四个运算符,突然想对类型转换进行一些深入了解。

  从最基础的简单数据类型说起。

  char、int、long、float、double...在用sizeof运算符对其求字节数的时候,我们知道每种类型都占有不同的字节,在不同的系统环境中同一类型所占字节数也有一些差别。计算机中存储数据的时候最后都会以0和1的方式存在,如果变量a = 1为int类型,在计算机中的占用4个字节(笔者所使用开发环境),存储在硬件中的信息为00000000 00000000 00000000 00000001,8个bit为1字节,一共为32个bit,在进行显示转换和隐式转换的时候会发生什么事情呢?假设此时将变量a转换为char类型,char的占用字节数为1(笔者所使用开发环境),那么就会从a的低位开始,截取1个字节,此时转换后的变量a为char类型,且在计算机中表示为00000001,打印输出的时候不再是1,而是变成一个笑脸(笔者所使用开发环境)。相同的道理,不管是进行强制转换还是隐式转换的时候,都遵从这个规律,所以在进行高字节数据类型转换为低字节数据类型时,会有精度丢失的情况,例如从01011111 01001100 01101111 00001001截取到01101111 00001001时,丢失2字节的数据。

  在C++中,保留了C的语言特点,在数据转换上面也是如此,C使用的类型转换“太不讲理”,甚至可以将结构转换为整型。所以在C++中,为了限制这种不合理的转换方式,以及安全的进行编码,使用4中类型转换运算符:dynamic_cast、const_cast、static_cast、reinterpret_cast,有了这些运算符,在进行基类与派生类的转换时变得更安全,详细的使用方式不做赘述,可以参考《C++ Primer Plus》中文第6版649页。

  除了基础的数据类型之外,C++最常用的就是类。

  类中有private部分和public部分,有成员变量和各种成员函数等,声明定义一个类时不会创建一个类对象,可以说不占用计算机内存,而创建一个类对象的时候, 会为类中的成员变量分配空间,而成员函数不占用空间,这些可以用sizeof(class_name)来验证,所以对类对象的数据转换其实就是对多个简单数据类型进行转换。在使用类对象的时候,经常会遇到基类与派生类的转换,或者是基类指针指向派生类对象,我们会对此表示很疑惑,一开始并不知道这是个什么概念,但现在,我们对类的存储和转换有了一定的了解就会有头绪,派生类的成员变量从基类中继承,所以基类成员函数对其成员变量的操作简单点看就是对简单数据进行操作,只不过类概念将其封装,外界不可以使用,而派生类具有和基类相同的“简单数据”成员变量,所以基类指针可以用来指向派生类并且进行其他操作。

  不管使用简单数据类型或者结构或者类,回归到计算机中都是用0和1实现,所以搞清楚最基础的情况自然而然就能对往出延伸至更复杂的情况,与编写递归调用是一种核心思想,甚至处理各种程序设计的问题时这种思想仍然适用!


(注:笔者能力有限,所用言辞可能并不科学严谨,有疏漏出错之处还望批评指正)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值