• 技术文章 >后端开发 >C#.Net教程

    C/C++中字节序、类型转化的深入理解

    高洛峰高洛峰2016-11-17 13:12:36原创1444
    如果将字节序、类型转化单独一个拿出来说时,大家可能都觉得很简单,但是理解的不深入。如果将其结合起来探讨,可能我们就会理解的很透彻。

    关于字节序和类型转化的基础,大家如果不太理解,可以参考以下博客:

    https://my.oschina.net/u/1783725/blog/647973 大小字节序

    https://my.oschina.net/u/1783725/blog/700970 类型转化

    在进入正题之前,在啰嗦一句:

    系统位数不同对应数据类型的字节数大小也不同

    QQ图片20161117130906.png

    php入门到就业线上直播课:进入学习

    详细介绍两者之间的联系

    字节序: 操作的内存,就是将我们看到的数据存放在内存中的规则。

    大字节序:大端有效 ,高位数据先放入低地址内存 , 低位数据放入高地址内存;小字节序:小端有效,低位数据先放入低地址内存 , 高位数据再放入高地址内存

    操作内存(如:memcpy)就需要考虑字节序

    QQ图片20161117104700.png

    类型转化: 操作的是读出的数据,就是将从内存中读取的数据,根据类型字节的大小进行转化。

    位数多的转化为位数小的(会截断高位的数据,留下地位的数据),位数小的转化为位数多的(将高位的数据补为0)。

    QQ图片20161117104700.png

    一个例子来读懂他们

    1、赋值与字节序无关,操作内存(memcpy)就需要考虑字节序

    1:将unsigned long long类型的0xABCDEF1234赋值给unsigned long类型的变量,与字节序无关

    2:unsigned long long类型的0xABCDEF1234变量使用memcpy到short类型的变量,发现为0,与字节序有关

    代码如下:

    #include <stdio.h>int main(int argc, char *argv[])
    {
    	unsigned long long ullVar = 0xABCD1234;	
    	unsigned long ulVar1 = 0;	
    	unsigned long ulVar2 = 0;	
    	/*memcpy操作内存时,需要考虑系统的大小字节序,如果是大字节序的话,高位的数据保存在低地址上*/
    	memcpy(&ulVar1,&ullVar,sizeof(ulVar1));	/*赋值时,就是讲读出的数据按照要赋值的数据类型的大小进行转换*/
    	ulVar2 = ullVar;	printf("ulVar1=%x      ulVar2=%x \n",ulVar1,ulVar2); 
    	//输出:ulVar1=0      ulVar2=abcd1234
    	return 0;
    }
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:C/C++
    上一篇:C# 如何调用 C++ DLL中的函数接口和回调函数 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• c语言中源文件编译后生成什么文件• c语言标识符有哪些类型• C#中GDI+编程10个基本技巧二• ASP.NET使用Ajax如何返回Json对象的方法具体介绍• 应用绝对路径与相对路径
    1/1

    PHP中文网