`
xitong
  • 浏览: 6187772 次
文章分类
社区版块
存档分类
最新评论

小端模式与强制数据类型转换

 
阅读更多

小端模式与强制数据类型转换

1.先从一个问题说开去

C++数据类型转换的问题

#include <iostream.h>
void main()
{
	int i=0xb62;
	char c;
	c=i;
	cout<<c<<endl;
}

这里为什么输出的是b?

2.先检测一下我们所使用的电脑的CPU的字节序

版本一(有问题,结果无论如何都是34,不能说明34是高地址的还是低地址的)

版本二(根据shineyan1991的留言修改后得到的,在此谢谢shineyan1991的建议)


从上图可知,CPU的字节序是小端模式。

知识点
小端模式(Little-Endian)
数据类型中的高位数据存放于高地址部分,低位数据存放于低地址部分。简而言之:高位在后,低位在前。
大端模式(Big-Endian)
数据类型中的高位数据存放于低地址部分,低位数据存放于高地址部分。简而言之:高位在前,低位在后。

3.初步分析

0xb62是十六进制,因为char是一个字节的,所以我们只取低8位(丢弃了高字节,而保留了低字节),这是和语言有关,和CPU的架构无关,一个十六进制位转换为4个二进制位,所以,低8位就是62转换的,就是01100010,传递给char后,char的值就是98,根据ASCII,就会输出b。

4.强制数据类型转化

  强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型到另一类的转换。
当操作数的类型不同,而且不属于基本数据类型时,经常需要强制类型转换,将操作数转化为所需要的类型。强制类型转换具有两种形式,称为显式强制转换和隐式强制类型转换。

4.1.显式强制类型转换

显式强制类型转换需要使用强制类型转换运算符,格式如下:
type(<expression>)

(type)<expression>
其中,type为类型描述符,如int,float等。<expression>为表达式。经强制类型转换运算符运算后,返回一个具有type类型的数值,这种强制类型转换操作并不改变操作数本身,运算后操作数本身未改变,例如:
int nVar=0xab65;
char cChar=char (nVar);
上述强制类型转换的结果是将整型值0xab65的高端两个字节删掉,将低端两个字节的内容作为char型数值赋值给变量cChar,而经过类型转换后nVar的值并未改变。
4.2.隐式强制类型转换
隐式类型转换发生在赋值表达式和有返回值的函数调用表达式中。在赋值表达式中,如果赋值符左右两侧的操作数类型不同,则将赋值符右边操作数强制转换为赋值符左侧的类型数值后,赋值给赋值符左侧的变量。在函数调用时,如果return后面表达式的类型与函数返回值类型不同,则在返回值时将return后面表达式的数值强制转换为函数返回值类型后,再将值返回,如:
int nVar;
double dVar=3.88;
nVar=dVar;//执行本句后,nVar的值为3,而dVar的值仍是3.88 
4.3.在使用强制转换时应注意以下问题:
  1.类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。
  2.无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。
3.如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示。
  double ←── float 高
  ↑
  long
  ↑
  unsigned
  ↑
  int ←── char,short 低
  图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。 纵向箭头表示当运算符两边的运算数为不同类型时的转换,如一个long 型数据与一个int型数据一起运算,需要先将int型数据转换为long型, 然后两者再进行运算,结果为long型。所有这些转换都是由系统自动进行的, 使用时你只需从中了解结果的类型即可。这些转换可以说是自动的,但然,C语言也提供了以显式的形式强制转换类型的机制。
  4.当较低类型的数据转换为较高类型时,一般只是形式上有所改变, 而不影响数据的实质内容, 而较高类型的数据转换为较低类型时则可能有些数据丢失。
  5.当赋值运算符两边的运算对象类型不同时,将要发生类型转换, 转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。 C语言赋值时的类型转换形式可能会使人感到不精密和不严格,因为不管表达式的值怎样,系统都自动将其转为赋值运算符左部变量的类型。而转变后数据可能有所不同,在不加注意时就可能带来错误。 这确实是个缺点,也遭到许多人们批评。但不应忘记的是:c面言最初是为了替代汇编语言而设计的,所以类型变换比较随意。当然, 用强制类型转换是一个好习惯,这样,至少从程序上可以看出想干什么。

5.int ----->char类型转化时的内存操作

当我们把一个int型强制转化为byte时,由于byte只有1个字节,而int型是4个字节,这样就会产生截断,int把它最低的内存空间里的值放到了byte所对应的内存空间里。如图所示:
char int
********** **********
* 1 Byte * <-----------* 1 Byte * 低位
********** ********** |
* 1 Byte * 高位
********** |


6.深入分析开始的问题

内存地址是由上到下有从左至右依次递增的,小端字节序指低字节位数据存放在内存低地址处, 高字节位数据存放在内存高地址处; 大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。x86的CPU体系结构中,就是使用小端字节序,即低字节数据存放在低地址处,高字节数据存放在高地址处。将int型的数据转化成char型的数据时,我们只取低8位;如果我们的CPU是小端模式,则我们在进行强制类型转换时不需要调整字节内容,非常的方便;如果我们的CPU是大端模式,则我们,需要将高字节地址的数据存入低字节地址,也就是需要调整字节内容。

7.总结

小端模式 :强制转换数据不需要调整字节内容,因为1、2、4字节的存储方式的字节的位置是一样。
分享到:
评论

相关推荐

    神通数据库-数据库快速入门.pdf

    作为企业级大型、通用对象关系型数据库管理系统,神通数据库为用户提供的功能包括: • 支持丰富的数据类型 ...的默认映射关系、数据类型的精度匹配、空与非空信息提取、主键及相关索引建立等辅助功能,帮助用

    汇编语言教程

     3 基本的数据类型  1.3 习题 第2章 CPU资源和存储器  2.1 寄存器组  1 寄存器组  2 通用寄存器的作用  3 专用寄存器的作用  2.2 存储器的管理模式  1 16位微机的内存管理模式  2 32位微机的内存管理...

    HDCMS内容管理系统 v141221

    COOKIE加密处理数据预处理机制XSS安全防护表单自动验证强制数据类型转换输入数据过滤表单令牌验证防SQL注入图像上传检测优秀特性支持提供多项优化策略,速度非常快采用 MVC 设计模式生成干净的 URL灵活简单的html...

    HDCMS内容管理系统 v141221.zip

    强制数据类型转换 输入数据过滤 表单令牌验证 防SQL注入 图像上传检测 优秀特性支持 提供多项优化策略,速度非常快 采用 MVC 设计模式 生成干净的 URL 灵活简单的html标签数据调用 内容页tag管理 全站...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    3.11.5 数据类型转换 49 3.11.6 运算符优先级和结合性 50 表达式 50 4 最简单的 C程序设计—顺序程序设计 4.1 C语句概述 51 4.2 赋值语句 53 4.3 数据输入输出的概念及在 C 语言中的实现 54 4.4 字符数据的输入输出...

    精通正则表达式基于.NET ASP PHP JSP JavaScript

    JSPExample10.jsp 字符串类型与其他数据类型的转换 JSPExample11.jsp 解析字符串的子字符串 stringOP.html 页面数据提交至JSPExample12.jsp JSPExample12.jsp 字符串替换 JSPExample13.jsp ...

    PHP7标量类型declare用法实例分析

    强制模式(默认):体现在类型转换上 严格模式 模式声明:declare(strict_types=1); 默认情况值为0,值为1代表为严格校验的模式 可以使用的类型参数: int-float-bool-string-interfaces-array-callable 作用于形参...

    MyQEE开源PHP多项目及模块化开发框架 v3.0 RC2

    关于MyQEEMyQEE是一个开源、快速、优雅的轻量级PHP框架,支持HMVC模式,建立在PHP5.2基础之上,支持多项目管理开发,数据库内置自动主从分离功能,MySQL支持事务操作功能并且支持自动嵌套...* 强制数据类型转换;* 普通

    java基础笔记

    六、 强制数据类型转换 5 七、 基本运算符 6 八、 三目条件运算符 6 九、 常用函数归纳 6 第三节 7月20日 7 一、条件语句 7 二、循环语句 8 三、 几个循环的例子 9 第四节 7月21日 10 一、 方法的定义及声明 10 二、...

    19类型判断模式匹配

    AnyVal的子类有9个(基本数据类型):Byte,Short,Int,Long,Double,Float,Char,boolean,Unit 2.对类型的基本操作 1-判断当前对象是否是当前类型 Java中: obj instanceof 类 scala中: obj isInstanceOf[类] 2-将对象...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    3.11.5 数据类型转换 49 3.11.6 运算符优先级和结合性 50 表达式 50 4 最简单的 C程序设计—顺序程序设计 4.1 C语句概述 51 4.2 赋值语句 53 4.3 数据输入输出的概念及在 C 语言中的实现 54 4.4 字符数据的输入输出...

    php网络开发完全手册

    3.2.7 使用函数进行数据类型的强制 3.2.7 转换 57 3.3 小结 57 第4章 函数处理与数据引用 58 4.1 函数的定义与使用 58 4.1.1 函数的调用 58 4.1.2 用户自定义函数的编写 58 4.2 PHP常用函数 59 4.2.1 获得日期时间...

    corejava培训文档

    4.4. 强制类型转换 4.5. 转换的二种类型 4.6. 控制流 4.7. 循环语句 5. 四 数组 5.1. 声明数组 5.2. 创建数组 5.3. 初始化数组 5.4. 多维数组 5.5. 数组拷贝 6. 五 对象和类 6.1. 面向对象与面向...

    C++ Primer第四版【中文高清扫描版】.pdf

    5.12.5 何时需要强制类型转换 158 5.12.6 命名的强制类型转换 158 5.12.7 旧式强制类型转换 160 小结 161 术语 162 第6章 语句 165 6.1 简单语句 166 6.2 声明语句 167 6.3 复合语句(块) 167 6.4 语句作用域 168 ...

    后盾网HDPHP框架 2014.12.zip

    提供强大的、完整的类库包,满足开发中的项目需求,可以将...这些特性包括:* COOKIE加密处理* 数据预处理机制* XSS安全防护* 表单自动验证* 强制数据类型转换* 输入数据过滤* 表单令牌验证* 防SQL注入* 图像上传检测

    Visual C++ 2005入门经典.part08.rar (整理并添加所有书签)

    2.3.8 定义数据类型的同义词 2.3.9 具有特定值集的变量 2.3.10 指定枚举常量的类型 2.4 基本的输入输出操作 2.4.1 从键盘输入 2.4.2 到命令行的输出 2.4.3 格式化输出 2.4.4 转义序列 2.5 C++中的计算 2.5.1 赋值...

Global site tag (gtag.js) - Google Analytics