首页 后端开发 C#.Net教程 C/C++中字节序、类型转化的深入理解

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

Nov 17, 2016 pm 01:12 PM
c/c++

 如果将字节序、类型转化单独一个拿出来说时,大家可能都觉得很简单,但是理解的不深入。如果将其结合起来探讨,可能我们就会理解的很透彻。

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

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

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

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

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

QQ图片20161117130906.png

详细介绍两者之间的联系

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

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

    操作内存(如: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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

php与c#的区别有哪些 php与c#的区别有哪些 Jun 02, 2023 pm 01:45 PM

php与c#的区别有:1、语言类型系统不同,PHP属于动态,而C#为静态类型;2、使用的平台不同,PHP可以实现跨平台,而C#为Windows专属;3、编程范式不同,PHP支持面向对象、过程化和函数式编程,C#更倾向于面向对象编程;4、执行速度不同,PHP速度更快,C#相对较慢;5、应用场景不同,PHP应用于Web开发、服务器等,C#用于Windows桌面和Web应用程序。

使用Clang工具创建一个C/C++代码格式化工具 使用Clang工具创建一个C/C++代码格式化工具 Aug 26, 2023 pm 01:09 PM

Inthistutorial,wewillbediscussingaprogramtocreateaC/C++codeformattingtoolwiththehelpofclangtools.SETUPsudoaptinstallpythonsudoaptinstallclang-format-3.5然后我们将在当前用户具有读写权限的位置创建一个Python文件。示例importoscpp_extensions=(".cxx",".cpp&

为什么在C/C++中,结构体的sizeof不等于每个成员的sizeof之和? 为什么在C/C++中,结构体的sizeof不等于每个成员的sizeof之和? Aug 26, 2023 am 09:29 AM

sizeof()获取的结构类型元素的大小并不总是等于每个单独成员的大小。有时编译器会添加一些填充以避免对齐问题。所以尺寸可能会改变。当结构成员后面跟着一个尺寸较大的成员或位于结构末尾时,将添加填充。不同的编译器有不同类型的对齐约束。在C标准中,总对齐结构取决于实现。情况1在这种情况下,双精度z为8字节长,大于x(4字节))。因此又添加了4个字节的填充。此外,短类型数据y在内存中具有2字节空间,因此添加了额外的6字节作为填充。示例代码#include<stdio.h>structmyS

一文详解vscode配置C/C++运行环境【保姆级教学】 一文详解vscode配置C/C++运行环境【保姆级教学】 Feb 27, 2023 pm 07:33 PM

VScode中怎么开发置C/C++?怎么配置C/C++环境?下面本篇文章给大家分享一下VScode配置C/C++运行环境教程(保姆级教学),希望对大家有所帮助!

在C/C++中,有预增和后增两种操作 在C/C++中,有预增和后增两种操作 Aug 25, 2023 pm 02:25 PM

这里我们来看看什么是C或C++中的前自增和后自增。前自增和后自增都是自增运算符。但它们几乎没有什么区别。前自增运算符首先递增一个变量的值,然后将其分配给其他变量,但在后自增运算符的情况下,它首先分配给一个变量变量,然后增加值。示例#include<iostream>usingnamespacestd;main(){  intx,y,z;  x=10;  y=10;&nb

在C/C++中,strcpy()函数是用于将一个字符串复制到另一个字符串的函数 在C/C++中,strcpy()函数是用于将一个字符串复制到另一个字符串的函数 Sep 09, 2023 am 08:49 AM

函数strcpy()是一个标准库函数。它用于将一个字符串复制到另一个字符串。在C语言中,它在“string.h”头文件中声明,而在C++语言中,它在cstring头文件中声明。它返回指向目的地的指针。这是C语言中strcpy()的语法,char*strcpy(char*dest,constchar*src);strcpy()的一些关键点。它将整个字符串复制到目标字符串中。它替换整个字符串而不是追加它。它不会改变源字符串。下面是C语言中strcpy()的示例:示例 在线演示#in

C/C++程序用于计算一个数的阶乘中的尾随零的数量 C/C++程序用于计算一个数的阶乘中的尾随零的数量 Aug 29, 2023 pm 12:29 PM

这里我们将了解如何计算任意数字的阶乘结果中尾随0的数量。因此,如果n=5,则5!=120。只有一个尾随0。对于20!,它将是4个零作为20!=2432902008176640000。最简单的方法就是计算阶乘并计算0。但对于较大的n值,这种方法会失败。所以我们将采用另一种方法。如果质因数是2和5,那么尾随零就会出现。如果我们计算2和5,我们就可以得到结果。为此,我们将遵循此规则。尾随0=阶乘(n)素因数中5的计数算法countTrailingZeros(n)begin &

在C/C++中同时执行if和else语句 在C/C++中同时执行if和else语句 Sep 05, 2023 pm 02:29 PM

在本节中,我们将了解如何在C或C++代码中同时执行if和else部分。这个解决方案有点棘手。当if和else相继执行时,就像执行不存在if-else的语句一样。但在这里我们将看看它们是否存在如何依次执行它们。示例代码#include<iostream>usingnamespacestd;intmain(){  intx=10;  if(x>5) {  &

See all articles