关于 unsigned 型变量在计算过程中发生的事情
运行环境:CentOS release 5.8 (Final)
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
unsigned short u = ;
unsigned int n = ; //Style left:
// u = u - 11;
// n = u; //Style right:
n = u - ; cout<<"n=="<<n<<endl;
return ;
}
运行结果:
Style left :
$ ./a.out
n==65535
Style right :
$ ./a.out
n==4294967295
下面是分别对这两种方式的汇编:
unsigned 变量先减(sub),后赋值给n unsigned 变量先扩展,后进行减运算,最后赋值给非 unsigned 变量
注:movzx,汇编语言数据传送指令MOV的变体。无符号扩展,并传送。
movzx 主要作用是,把一个变量进行编译器扩展,放到寄存器eax
1个二进制位称为1个bit(比特位) 1 bit
8个bit称为1个Byte(字节) 1 Byte == 8 bit
2个Byte就是1个 Word(机器字) 1 Word == 2 Byte
2个Word就是1个 DWord(机器双字) 1 DWord == 2 Word
WORD 表示2个字节,即 sizeof(unsigned short)。unsigned short 表示的范围:[0, 65536)
DWORD 表示4个字节,sizeof(unsigned int)。unsigned int 表示的范围:[0, 4294967296)
(一)左侧的方式:先运算后赋值分两步进
//Style left:
u = u - ;
n = u;
对应的汇编为:
sub WORD PTR [ ebp-0xc ], 0xb
movzx DOWRD PTR [ ebp-0x8 ], eax
【解释】:
因为第一步是对 unsigned 变量 u 进行自减,所以此时不需要进行编译器扩展
10 – 11 得到值为 -1,即 0xffff (unsigned short 能表示的最大范围就是4个f)。
第二步涉及到了赋值操作,
编译器要会赋值之前,先对赋值操作符=右侧的表达式进行编译器扩展:
将 0xffff 扩展为 0x0000ffff,然后接受赋值的变量是一个 DWORD,
根据 DWORD 的长度对扩展的值进行截取,DWORD 长度刚好能接受 0x0000ffff,
转换成 10 进制即为 65535
【结论】:
编译器先进行计算后,按 WORD 进行扩展,所以得到的是 WORD 范围的最大值(65535)
(二)右侧的方式:运算和赋值合为一步进行
//Style right:
n = u - ;
对应的汇编为:
movzx eax, WORD PTR [ ebp-0xc ]
sub eax, 0xb
由于赋值符右侧的表示范围和传进去的变量不是一种类型,编译器先对赋值符=右侧的值进行扩展,
10 – 11 == -1,编译器扩展为 0x0000ffffffff(只能扩展到DWORD?)
右侧的 DWORD 接收后,转换为 10 进制即为 4294967295
【结论】:
编译器先进行计算后,按 DWORD 进行扩展,所以得到的是 DWORD 范围的最大值(4294967295)
关于 unsigned 型变量在计算过程中发生的事情的更多相关文章
- 从输入 URL 到浏览器接收的过程中发生了什么事情
从输入 URL 到浏览器接收的过程中发生了什么事情? 原文:http://www.codeceo.com/article/url-cpu-broswer.html 从触屏到 CPU 首先是「输入 U ...
- 【转】SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误
SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误 最近在VS2013上连接远程数据库时,突然连接不上,在跑MSTest下跑的时候,QTAgent32 crash.换成IIS ...
- Sql server2012连接Sql server 2008时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误。(provider:SSL Provider,error:0-接收到的消息异常,或格式不正确。)
以前连接是正常的,就这两天连不上了.(没有耐心的直接看末尾解决办法) 错误消息如下: 1.尝试读取或写入受保护的内存.这通常指示其他内存已损坏.(System.Data) 2.已成功与服务器建立连接, ...
- 从输入 URL 到浏览器接收的过程中发生了什么事情?
从输入 URL 到浏览器接收的过程中发生了什么事情? What really happens when you navigate to a URL 上面两篇文章都解读的很好,值得阅读. 接下来在总结一 ...
- 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确。)
之前做好的asp.net部署后,发现 访问数据库时: 异常:已捕获: "已成功与服务器建立连接,但是在登录过程中发生错误. (provider: SSL Provider, error: 0 ...
- vs 或 Sql server2012连接Sql server时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误
以前连接是正常的,就这两天连不上了.(没有耐心的直接看末尾解决办法) 错误消息如下: 1.尝试读取或写入受保护的内存.这通常指示其他内存已损坏.(System.Data) 2.已成功与服务器建立连接, ...
- SQL Server(解决问题)已成功与服务器建立连接,但是在登录过程中发生错误。(provider: Shared Memory Provider, error:0 - 管道的另一端上无任何进程。
http://blog.csdn.net/github_35160620/article/details/52676416 如果你在使用新创建的 SQL Server 用户名和密码 对数据库进行连接的 ...
- CASE:DB shutdown/open 过程中发生异常导致JOB不能自动执行
CASE:DB shutdown/open 过程中发生异常导致JOB不能自动执行 现象: 一个DB中的所有JOB在3月25日之后就不再自动运行,查询DBA_JOBS,发现LAST_DATE定格在3月2 ...
- sql server 2008启动时:已成功与服务器建立连接,但是在登录过程中发生错误。(provider:命名管道提供程序,error:0-管道的另一端上无任何进程。)(Microsoft SQL Server,错误:233) 然后再连接:错误:18456
问题:sql server 2008启动时:已成功与服务器建立连接,但是在登录过程中发生错误.(provider:命名管道提供程序,error:0-管道的另一端上无任何进程.)(Microsoft S ...
随机推荐
- javascript实现简单的轮播图片
方法一: <script> var curIndex=0;//时间间隔(单位毫秒),每秒钟显示一张,数组共有5张图片放在Photos文件夹下. var timeInterval=1000; ...
- [WPF]DataGridHyperlinkColumn网址过长TextTrimming无效
<DataGridHyperlinkColumn Binding="{Binding source}" Header="来源"> <DataG ...
- 本机不能访问虚拟机中flask的web服务器的解决办法
在虚拟机的linux里写flask程序,在本机中用"ip:端口号"的方法不能访问,查资料试了各种方法都不行.最后发现问题出在flask程序本身: flask的app.run()方法 ...
- ps
快速恢复默认值 有些不擅长Photoshop的朋友为了调整出满意的效果真是几经周折,结果发现还是原来的默认效果最好,这下傻了眼,后悔不该当初呀!怎么恢复到默认值呀?试着轻轻点按选项栏上的工具图标,然 ...
- oralce 密码长度
Oracle 11G的新特性所致, Oracle 11G创建用户时缺省密码过期限制是180天, 如果超过180天用户密码未做修改则该用户无法登录. Oracle提示错误消息ORA-28001: the ...
- Const关键字
const const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性.另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程 ...
- c#数据绑定(3)——数据转化为信息
文/嶽永鹏 本文主要在数据绑定1和2中新增了DataSet对象,练习了如何在DataSet中添加表.关系和约束,同时本文也简要的介绍了如何将数据转化为信息. 目标界面: XAML代码: <Gri ...
- 20169212《Linux内核原理与分析》 第十周作业
云课堂回顾学习 1. 进程调度的时机 中断处理过程(包括时钟中断.I/O中断.系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule() ...
- 关于javascript闭包中的this对象
我们知道, this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象.<Javascript高级程序设计&g ...
- html快速入门(基础教程+资源推荐)
1.html究竟是什么? 从字面上理解,html是超文本标记语言hyper text mark-up language的首字母缩写,指的是一种通用web页面描述语言,是用来描述我们打开浏览器就能看到的 ...