运行环境: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 型变量在计算过程中发生的事情的更多相关文章

  1. 从输入 URL 到浏览器接收的过程中发生了什么事情

    从输入 URL 到浏览器接收的过程中发生了什么事情? 原文:http://www.codeceo.com/article/url-cpu-broswer.html 从触屏到 CPU  首先是「输入 U ...

  2. 【转】SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误

    SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误 最近在VS2013上连接远程数据库时,突然连接不上,在跑MSTest下跑的时候,QTAgent32 crash.换成IIS ...

  3. Sql server2012连接Sql server 2008时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误。(provider:SSL Provider,error:0-接收到的消息异常,或格式不正确。)

    以前连接是正常的,就这两天连不上了.(没有耐心的直接看末尾解决办法) 错误消息如下: 1.尝试读取或写入受保护的内存.这通常指示其他内存已损坏.(System.Data) 2.已成功与服务器建立连接, ...

  4. 从输入 URL 到浏览器接收的过程中发生了什么事情?

    从输入 URL 到浏览器接收的过程中发生了什么事情? What really happens when you navigate to a URL 上面两篇文章都解读的很好,值得阅读. 接下来在总结一 ...

  5. 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确。)

    之前做好的asp.net部署后,发现 访问数据库时: 异常:已捕获: "已成功与服务器建立连接,但是在登录过程中发生错误. (provider: SSL Provider, error: 0 ...

  6. vs 或 Sql server2012连接Sql server时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误

    以前连接是正常的,就这两天连不上了.(没有耐心的直接看末尾解决办法) 错误消息如下: 1.尝试读取或写入受保护的内存.这通常指示其他内存已损坏.(System.Data) 2.已成功与服务器建立连接, ...

  7. SQL Server(解决问题)已成功与服务器建立连接,但是在登录过程中发生错误。(provider: Shared Memory Provider, error:0 - 管道的另一端上无任何进程。

    http://blog.csdn.net/github_35160620/article/details/52676416 如果你在使用新创建的 SQL Server 用户名和密码 对数据库进行连接的 ...

  8. CASE:DB shutdown/open 过程中发生异常导致JOB不能自动执行

    CASE:DB shutdown/open 过程中发生异常导致JOB不能自动执行 现象: 一个DB中的所有JOB在3月25日之后就不再自动运行,查询DBA_JOBS,发现LAST_DATE定格在3月2 ...

  9. sql server 2008启动时:已成功与服务器建立连接,但是在登录过程中发生错误。(provider:命名管道提供程序,error:0-管道的另一端上无任何进程。)(Microsoft SQL Server,错误:233) 然后再连接:错误:18456

    问题:sql server 2008启动时:已成功与服务器建立连接,但是在登录过程中发生错误.(provider:命名管道提供程序,error:0-管道的另一端上无任何进程.)(Microsoft S ...

随机推荐

  1. DuiLib 源码分析之解析xml类CMarkup & CMarkupNode cpp文件

    时隔5个月才有时间接着写未完成的实现部分,也是惭愧呀 选几个关机的函数来解析,一些get方法就忽略掉吧 CMarkupNode 与 CMarkUp 互为友元类,CMarkUp 实现解析,CMarkup ...

  2. [转]解决:Entity Framework + MariaDb(MySql)中文乱码

    转自:http://fenglongsheng.com/post/6640.html 今天写一MVC4+Entity Framework+Mysql的小例子时,发现中文写到数据库里是N个问号(乱码哦~ ...

  3. H5手机端关注的问题

    手机端页面写css时应该注意的问题: 设备的屏幕尺寸   设备的分辨率   用户的操作习惯以及点击区域的大小   移动端浏览器的特性   鉴于分辨率等情况而引出的图片尺寸.布局方式等诸多细节问题   ...

  4. IAR #pragma vector 中断入口地址

    在IAR编译器里用关键字来__interrupt来定义一个中断函数.用#pragma vector来提供中断函数的入口地址. #pragma vector = 0x12    //定时器0溢出中断入口 ...

  5. mac下安装nginx+php+mysql+xdebug

    一,安装homebrew 就像linux下面有yum一样,mac也有个homebrew,管理软件非常便捷. 官网:http://brew.sh/index_zh-cn.html 上面有句命令,复制下来 ...

  6. python的字符串内建函数

    http://www.ziqiangxuetang.com/python/python-strings.html

  7. lesson32 Shopping for food

    EMPLOYEE: undefined763cff06-f7fc-4a01-b5f8-c78a2f0110ae.mp3 Can I help you, Sir? 0先生,我能帮你吗? BOB: und ...

  8. php 二维数组排序

    usort($info ,function($a,$b){ $a1 = $a['score']; $b1 = $b['score']; if($a1 == $b1) return 0; return ...

  9. sql server 维护计划与作业关系区别

    sql server 维护计划与作业关系区别 对于二者的区别,你可以把维护计划看作是针对数据库进行维护的作业模板.自定义作业具有更广泛的用途,当然,也具有更复杂的操作.所以,如果 仅仅是做个数据库优化 ...

  10. biweb后台添加上传下载功能

    1.数据库对应表添加字段 file       varchar(100) 2.对应的后台 模块名/admin/addinfo.php里添加如下代码: //文件上传 if ((($_FILES[&quo ...