看了一篇博文,该文章中有如下描述

 #include <stdio.h>  

 int main()
{
unsigned short a = ;
unsigned short b = ; if (a < (b-)) //a和b-1的结果-1都被转换为int类型进行比较,1<-1,显然false
{
printf("in if\n");
} return ; }

预期结果时打印“in if”,但实际运行时却发现啥都没有输出。改为如下代码就可以正常输出“in if”,此时与预期相符

 #include <stdio.h>  

 int main()
{
unsigned short a = ;
unsigned int b = ; if (a < (b-)) //b-1的结果-1,被转换为0xffffffff,1<0xffffffff,显然true啊
{
printf("in if\n");
} return ; }

使用汇编,直接对比两者结果(公司安全不让发送外网图片..),发现主要差异在如下5行,前四行中对short进行了扩展,由2字节扩展为4字节,高位填充0。导致运行结果与与预期不符合的原因就在第5行:jge 8048461

  <main>:
: 8d 4c lea 0x4(%esp),%ecx
: e4 f0 and $0xfffffff0,%esp
804842c: ff fc pushl -0x4(%ecx)
804842f: push %ebp
: e5 mov %esp,%ebp
: push %ecx
: ec sub $0x14,%esp
: c7 f6 movw $0x1,-0xa(%ebp)
804843c: c7 f4 movw $0x0,-0xc(%ebp)
: 0f b7 f6 movzwl -0xa(%ebp),%eax
: 0f b7 f4 movzwl -0xc(%ebp),%edx
804844a: ea sub $0x1,%edx
804844d: d0 cmp %edx,%eax
804844f: 7d jge <main+0x3c>
: ec 0c sub $0xc,%esp
: push $0x8048500
: e8 a2 fe ff ff call <puts@plt>
804845e: c4 add $0x10,%esp
: b8 mov $0x0,%eax
: 8b 4d fc mov -0x4(%ebp),%ecx
: c9 leave
804846a: 8d fc lea -0x4(%ecx),%esp
804846d: c3 ret
804846e: xchg %ax,%ax

汇编中的数值是没有符号之分的,但指令是有符号分别的,上述使用的jge即是有符号比较的方式,导致比较结果为:if (1<-1),为false,不会打印字符串

指令 含义 运算符号
jbe unsigned below or equal (lower or same) <=
jae unsigned above or equal (higher or same) >=
jb unsigned below (lower) <
ja unsigned above (higher) >
jle signed less or equal <=
jge signed greater or equal >=
jl signed less than <
jg signed greater than >

C语言的隐式类型转换的更多相关文章

  1. C++的隐式类型转换

    C++是一种复杂的语言,其中有许多“好玩”的特性,学习C++的过程就像在海边捡一颗颗石头,只要坚持不懈,也许一颗颗小石头也能建起你自己小小的城堡. 废话完后,讲讲自己捡到的石头:隐式类型转换 学习出处 ...

  2. 「译」JavaScript 的怪癖 1:隐式类型转换

    原文:JavaScript quirk 1: implicit conversion of values 译文:「译」JavaScript 的怪癖 1:隐式类型转换 译者:justjavac 零:提要 ...

  3. 深入js隐式类型转换

    前言 相信刚开始了解js的时候,都会遇到 2 =='2',但是 1+'2' == '1'+'2'为false的情况,这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这 ...

  4. 有趣的JavaScript隐式类型转换

    JavaScript的数据类型是非常弱的(不然不会叫它做弱类型语言了)!在使用算术运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和数字相加.之所以不同的数据类型之间可以做运算,是因为 ...

  5. 从Qt谈到C++(一):关键字explicit与隐式类型转换

    转载:果冻虾仁 提出疑问 当我们新建了一个Qt的widgets应用工程时.会自动生成一个框架,包含了几个文件. 其中有个mainwindow.h的头文件.就是你要操纵的UI主界面了.我们看看其中的一段 ...

  6. scala学习手记35 - 隐式类型转换

    先来看一下下面的内容: 2 days "ago" 5 days "from_now" 如上的内容具体应该是什么呢?不过怎么看也不像是代码.不过既然是在学代码,拿 ...

  7. JavaScript显式类型转换与隐式类型转换

    隐式类型转换 四则运算 判断语句 toString 在 JavaScript 中声明变量不需指定类型,对变量赋值也没有类型检查,同时还允许隐式类型转换. 这些特征说明 JavaScript 属于弱类型 ...

  8. JavaScript隐式类型转换(详解 +,-,*,/,==)

    JavaScript 在 运算 或 比较 之前, 会自动进行隐式类型转换. 下面我们来仔细讲一讲 + - * / == 运算符经历了哪些过程. 类型转换 ECMAScript 运行时系统会在需要时从事 ...

  9. 彻底理解c++的隐式类型转换

    隐式类型转换可以说是我们的老朋友了,在代码里我们或多或少都会依赖c++的隐式类型转换. 然而不幸的是隐式类型转换也是c++的一大坑点,稍不注意很容易写出各种奇妙的bug. 因此我想借着本文来梳理一遍c ...

随机推荐

  1. day5(字符编码、数据类型、列表基本操作)

    一.字符编码 计算器所认识的编码都是二进制编码 二进制与十进制转换 计算机最开始使用的编码是美国的 ASCll编码 计算机容量单位 字符编码 python2.x 默认编码使用的是ASCll pytho ...

  2. 总结MySQL大数据量下如何进行优化

    写在建库前: 在确定数据库业务后.建立数据库表格时,就应对一些常见问题有所考虑,以避免在数据增长一段时间后再做应对,可能造成时间及维护成本增加: 数据的月增量,年增量 数据的快速增长点 是否需要触发器 ...

  3. Android中Activity被系统会收前页面信息保存

    1.重写onSaveInstanceState方法 protected void onSaveInstanceState(Bundle outState) { super.onSaveInstance ...

  4. js中reduce()用法

    reduce()方法 定义:reduce()接收一个函数作为累加器,数组中每个值(从左到右)开始缩减,最终计算为一个值 对于空数组不执行回调函数 语法:array.reduce(function(to ...

  5. Java Web项目(Extjs)报错二

    1.Java Web项目(Extjs)报错二 具体报错如下: usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ...

  6. SQLyog键盘快捷方式

    SQLyog键盘快捷方式 连接 Ctrl+M 创建新连接 Ctrl+N 以当前连接属性创建新连接 Ctrl+F4/Ctrl+W 断开当前连接 Ctrl+Tab 切换到下一个连接 Ctrl+Shift+ ...

  7. dojo中获取表格中某一行的某个值

    dojo中经常出现对表格中的某行进行操作,如单击某行修改.删除等.那怎样获取某行的唯一标示呢? 如查询表格中的某列有个userId,并且这个是唯一的,那么可以通过它来访问这一列 具体操作代码如下: v ...

  8. Linux之批量挂载硬盘

    ############parted工具分区############### #!/bin/bash #shell脚本开头格式PATH=/bin:/sbin:/usr/bin:/usr/sbin #保证 ...

  9. 在实训时做的项目出现的ajax json数据传送的问题

    json数据在前后端数据交互的时候非常常见,但是大部分人对json都么有系统的学习过,所以就会出现一些很简单的问题却要非很大劲去解决. 在用json传递数据的时候属性必须用双引号括住,一般如果在进行字 ...

  10. 【CJOJ2484】【Luogu2805】最小函数值(函数最小值)

    题面 Description 有n个函数,分别为F1,F2,...,Fn.定义 Fi(x)=Aix2+Bix+Ci(x∈N∗)Fi(x)=Aix2+Bix+Ci(x∈N∗) .给定这些Ai.Bi和Ci ...