先贴一段代码:

跟踪后看到:

无论是给bool类型赋值为正整数 还是true,都会转变为1。

那么float和double类型如何转换为bool类型?

将bool类型赋值给int类型变量,就是借助了寄存器eax,将1byte的值放入eax,再从eax取出dword宽度的值即可。但是问题来了,程序在刚开始“初始化”时会有一段代码:

会将eax赋值为:

eax是32位的,存入1byte的时候,会变成CCCCCC01,你如何保证再取出dword(32位)给i1时,其它高位变成0?这就要靠movzx了!这就是movzx与mov不同的地方:

movzx一般用于将较小值拷贝到较大值中。movzx是将源操作数的内容拷贝到目的操作数,并将该值0扩展至16位或者32位。但是它只适用于无符号整数(说白了,填充0,是进行无符号扩展)。 他大致有的三种格式:

movzx 32位通用寄存器, 8位通用寄存器/内存单元
movzx 32位通用寄存器, 16位通用寄存器/内存单元
movzx 16位通用寄存器, 8位通用寄存器/内存单元
例如
令eax=00304000h,若执行 movzx eax, ax后 eax = 00004000h ;若执行 movzx eax, ah后 eax = 00000040h。
又如:
MOV BL,80H
MOVZX AX,BL
运行完以上汇编语句之后,AX的值为0080H。由于BL为80H,最高位也即符号位为1,但在进行无符号扩展时,其扩展的高8位均为0,故赋值AX为0080H。

总之,movzx其实就是将我们的源操作数取出来,然后置于目的操作数,目的操作数其余位用0填充

对于signed和unsigned char

同样是赋值以0FFh,但是不同类型的对象对这个二进制数的解释不同:

输出结果为:

将-1赋值给unsigned char ,输出的结果是255,说明0FFh被解释为unsigned char类型了,这也进一步说明,如果一个“式子”中,同时有signed和unsigned 类型,会自动将signed类型转换为unsigned类型

进一步观察,当我们企图输出c1和sc2时,仔细观察二者汇编代码的区别:

前者是movzx,而后者是movsx,之前讲了movzx,现在我们再来讲讲movsx:

movsx是传送并进行符号扩展,由于sc2是signed,所以,要考虑占用1byte空间的它扩充为dword大小之后,多出来的空间用什么填充,当然是用符号位填充,这样,如果sc2原本是正的,扩充到dword之后仍是正的,如果是负的,扩充到dword之后仍是负的。

例如,MOV BL,80H

MOVSX AX,BL
运行完以上汇编语句之后,AX的值为FF80H。由于BL为80H=1000 0000,最高位也即符号位为1,在进行带符号扩展时,其扩展的高8位均为1,故赋值AX为1111 1111 1000 0000,即AX=FF80H。
再例如,mov CL, 50H

MOVSX AX, CL
50H=0101 0000,最高位为0,则AX为0000 0000 0101 0000
结果AX = 50H
最后再来说下"cout <<":
这里的三个push是operator<<函数的三个参数,可以查看内存得知:
第三个push进来的参数正好是这个字符串。
 
 
 
 
 
 

Disassembly2:Built-in Type的更多相关文章

  1. POJ 2947 Widget Factory(高斯消元)

    Description The widget factory produces several different kinds of widgets. Each widget is carefully ...

  2. Struts(二十):自定义类型转换器

    如何自定义类型转换器: 1)为什么需要自定义类型转化器?strtuts2不能自动完成字符串到所有的类型: 2) 如何定义类型转化器? 步骤一:创建自定义类型转化器的类,并继承org.apache.st ...

  3. poj2947 高斯消元

    Widget Factory Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 5218   Accepted: 1802 De ...

  4. Widget Factory (高斯消元解线性方程组)

    The widget factory produces several different kinds of widgets. Each widget is carefully built by a ...

  5. 【POJ】2947 Widget Factory(高斯消元)

    http://poj.org/problem?id=2947 各种逗啊..还好1a了.. 题意我就不说了,百度一大把. 转换为mod的方程组,即 (x[1,1]*a[1])+(x[1,2]*a[2]) ...

  6. POJ Widget Factory 【求解模线性方程】

    传送门:http://poj.org/problem?id=2947 Widget Factory Time Limit: 7000MS   Memory Limit: 65536K Total Su ...

  7. UI Framework-1: views Windowing

    views Windowing views provides support for creating dialog boxes and other kinds of windows through ...

  8. POJ 2947:Widget Factory 求同余方程

    Widget Factory Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 5173   Accepted: 1790 De ...

  9. 错误提示:The project was not built since its build path is incomplete. Cannot find the class file for java.lang.Object. Fix the build path then try building this project The type java.lang.Object cannot b

    原文:http://www.cnblogs.com/mmzs/p/7662863.html 错误类型: 搞了很久才找到原因.解决办法写出来分享: 出现以上错误的原因是玩耍maven时多装了个jre.本 ...

随机推荐

  1. ural 1049. Brave Balloonists(标准分解式,数论)

    1049. Brave Balloonists Time limit: 2.0 secondMemory limit: 64 MB Ten mathematicians are flying on a ...

  2. C# 处理图片 不规则图形裁剪

    最近项目要求实现不规则裁剪功能.本来想用html5的canvas在前端实现的,但是发现有点困难,以下为C#端对图对片的处理. 为了让大家知道下面内容是否是自己想要的,我先发效果图. 原图 通过下面代码 ...

  3. divide an integer into X parts (as even as possible)

    the algorithm is like this: it evenly spreads an integer N over K cells. for i = 0 to K array[i] = N ...

  4. jquery datatable 参数api

    jQuery 的插件 dataTables 是一个优秀的表格插件,提供了针对表格的排序.浏览器分页.服务器分页.筛选.格式化等功能.dataTables 的网站上也提供了大量的演示和详细的文档进行说明 ...

  5. Qt学习之系列[9] – QCoreApplication:processEvents()可能会引起递归,导致栈溢出崩溃

    api含义:QCoreApplication::processEvents() 将处理所有事件队列中的事件并返回给调用者. 问题描述: 当主线程在某个槽函数里正在执行processEvents时, 刚 ...

  6. NSTimer定时器

    NSTimer的避免内存泄露与控制器的正确引用和释放:

  7. mysql 中tinytext、text、mediumtext和longtext详解

    一.数字类型 类型 范围 说明   Char(N) [ binary] N=1~255 个字元binary :分辨大小写 固定长度 std_name cahr(32) not null VarChar ...

  8. maven source

    accepted To download sources for your dependencies: mvn eclipse:eclipse -DdownloadSources=true To at ...

  9. Androidndk开发打包时我们应该如何注意平台的兼容(x86,arm,arm-v7a)

    很多朋友在开发Android JNI的的时候,会遇到findlibrary returned null的错误,因为某种原因,so没有打包到apk中.下面浅析下引起该错误的原因以及平台兼容性问题. 一. ...

  10. Delphi XE2 生成的.exe 在未安装有Delphi的电脑上运行提示 “丢失 rtl160.bpl”

    解决方案: XE2中加入了多平台的概念,默认的Release模式,也是带包编译,带运行时库的,所以,需要手工设置一下工程选项: 打开工程以后,Project-->Options-->左侧树 ...