小端模式与强制数据类型转换_第1页
小端模式与强制数据类型转换_第2页
小端模式与强制数据类型转换_第3页
小端模式与强制数据类型转换_第4页
小端模式与强制数据类型转换_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

小端模式与强制数据类型转换先从一个问题说开去C++数据类型转换的问题viewplain#include<iostream.h>voidmain()13.{inti=0xb62;charc;c=i;cout<<c<<endl;}这里为什么输出的是b?先检测一下我们所使用的电脑的CPU的字节序版本一(有问题,结果无论如何都是34,不能说明34是高地址的还是低地址的)ttinclude"stdafx.h"intmain(intargc,char*argu[])'//printf("HelloWorld*\n");inti=0x1234;charc=(char)i;printf("c^xXn",c);return0;~C:\DOCUIEHTSABDSETTIIGS\CE123\^S\11\Debug\l1.exec=34Pressmykeytocontinue—版本二(根据shineyan1991的留言修改后得到的,在此谢谢shineyan1991的建议)^include'stdaFx.h"±ntitain(Li>tarqc,tzhar*argti[])inta■0x123<i;chMb=*(char*)&a;〃通过将Mt强制类型转换成6邳单字节,磷干a的低地址部分'如果h等priRtFC^xXo";财;oTJ:\Dncmenl.^udS«tVlLXDebiicV]!1.mb34Pi*esskeptocentinue从上图可知,CPU的字节序是小端模式。知识点小端模式(Little-Endian)数据类型中的高位数据存放于高地址部分,低位数据存放于低地址部分。简而言之:高位在后,低位在前。大端模式(Big-Endian)数据类型中的高位数据存放于低地址部分,低位数据存放于高地址部分。简而言之:高位在前,低位在后。初步分析0xb62是十六进制,因为char是一个字节的,所以我们只取低8位(丢弃了高字节,而保留了低字节),这是和语言有关,和CPU的架构无关,一个十六进制位转换为4个二进制位,所以,低8位就是62转换的,就是01100010,传递给char后,char的值就是98,根据ASCII,就会输出b0强制数据类型转化强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型到另一类的转换。当操作数的类型不同,而且不属于基本数据类型时,经常需要强制类型转换,将操作数转化为所需要的类型。强制类型转换具有两种形式,称为显式强制转换和隐式强制类型转换。4.1.显式强制类型转换显式强制类型转换需要使用强制类型转换运算符,格式如下:type(<expression>)或(type)<expression>其中,type为类型描述符,如int,float等。<expression>为表达式。经强制类型转换运算符运算后,返回一个具有type类型的数值,这种强制类型转换操作并不改变操作数本身,运算后操作数本身未改变,例如:viewplainintnVar=0xab65;charcChar=char(nVar);上述强制类型转换的结果是将整型值0xab65的高端两个字节删掉,将低端两个字节的内容作为char型数值赋值给变量cChar,而经过类型转换后nVar的值并未改变。4.2.隐式强制类型转换隐式类型转换发生在赋值表达式和有返回值的函数调用表达式中。在赋值表达式中,如果赋值符左右两侧的操作数类型不同,则将赋值符右边操作数强制转换为赋值符左侧的类型数值后,赋值给赋值符左侧的变量。在函数调用时,如果return后面表达式的类型与函数返回值类型不同,则在返回值时将return后面表达式的数值强制转换为函数返回值类型后,再将值返回,如:viewplainintnVar;doubledVar=3.88;nVar=dVar;//执行本句后,nVar的值为3,而dVar的值仍是3.884.3.在使用强制转换时应注意以下问题:类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示。double«float高TlongTunsignedTint«char,short低图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。纵向箭头表示当运算符两边的运算数为不同类型时的转换,如一个long型数据与一个int型数据一起运算,需要先将int型数据转换为long型,然后两者再进行运算,结果为long型。所有这些转换都是由系统自动进行的,使用时你只需从中了解结果的类型即可。这些转换可以说是自动的,但然,C语言也提供了以显式的形式强制转换类型的机制。当较低类型的数据转换为较高类型时,一般只是形式上有所改变,而不影响数据的实质内容,而较高类型的数据转换为较低类型时则可能有些数据丢失。当赋值运算符两边的运算对象类型不同时,将要发生类型转换,转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。C语言赋值时的类型转换形式可能会使人感到不精密和不严格,因为不管表达式的值怎样,系统都自动将其转为赋值运算符左部变量的类型。而转变后数据可能有所不同,在不加注意时就可能带来错误。这确实是个缺点,也遭到许多人们批评。但不应忘记的是:c面言最初是为了替代汇编语言而设计的,所以类型变换比较随意。当然,用强制类型转换是一个好习惯,这样,至少从程序上可以看出想干什么。5.int-—>char类型转化时的内存操作当我们把一个int型强制转化为byte时,由于byte只有1个字节,而int型是4个字节,这样就会产生截断,int把它最低的内存空间里的值放到了byte所对应的内存空间里。如图所示:charint*********************1Byte*<*1Byte*低位********************|*1Byte*高位**********|深入分析开始的问题内存地址是由上到下有从左至右依次递增的,小端字节序指低字节位数据存放在内存低地址处,高字节位数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。x86的CPU体系结构中,就是使用小端字节序,即低字节数据存放在低地址处,高字节数据存放在高地址处。将int型的数据转化成char型的数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论