一、定义

  integral promotion:

  "A character, a short integer, or an integer bit-field, all either signed or not, or an object of enumeration type, may be used in an expression wherever an integer may be used. If an int can represent all the values of the original type, then the value is converted to int; otherwise the value is converted to unsigned int. This process is called integral promotion."

  即:

  1) 类型为char、short或整型位域(带符号或无符号的)的变量,以及枚举类型的对象,都可以放置在表达式中能够使用整型变量的位置。

  2) 如果1)中的变量的类型值能够用int表示,那么原值被转换为int;否则的话,转为unsigned int。

二、实例

  1)char整形提升 

#include <stdio.h>
#include <conio.h> int main(int argc, char *argv[])
{
unsigned char a = 0xA5;
unsigned char b = ~a>>+; printf("b=%d\n",b); getch();
return ;
}

  首先a的二进制表示是:10100101

  然后看表达式~a>>4+1,加法运算优先级比较高,等同于~a>>5,a整形提升为32位:0000 0000 0000 0000 0000 0000 1010 0101

  a按位取反为:1111 1111 1111 1111 1111 1111 0101 1010,右移(算数右移)5位:1111 1111 1111 1111 1111 1111 1111 1010

  赋值给unsig char类型的b:1111 1010 = 250

  2)unsigned int、signed int整型提升

/*整形提升*/
#include <stdio.h>
#include <conio.h>
int array[] = {, , , , , , };
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int main(int argc, char* argv[])
{
int d = -, x;
int size_of_array = sizeof(array);
int size_of_int = sizeof(array[]); if(d <= sizeof(array) / sizeof(array[]) - )
{
x = array[d+];
printf("x = %d\n", x);
}
getch();
return ;
}

  ①首先sizeof()运算符返回的是unsigned int类型的值

  ②所以if里的条件表达式就是两个unsigned int和signed int的比较

  ③根据整型提升规则会发生整型提升,而signed int不足以表达unsigned int的值,所以int类型的值-1会装换为unsigned int

  ④这个signed int的-1转化为unsigned int:

  signed int -1:1111 1111 1111 1111 1111 1111 1111 1111

  转换为unsigned int就是unsigned int所能表示的最大值,所以if里的 条件表达式返回的是0,x不会被赋值,输出语句不会执行.

  3)算数运算类型转换和整形提升:

#include <stdio.h>
#include <conio.h> int main(int argc, char *argv[])
{
unsigned char a,b;
unsigned char c; a = 0xFF;
b = 0x01; c = a + b; printf("output a+b = %d\n",(a+b));
printf("sizeof(a+b): %d\n", sizeof(a+b));
printf("output c = %d\n",c);
printf("sizeof(c): %d\n", sizeof(c)); getch();
return ;
}

  unsigned char a:1111 1111

  unsigned char b:0000 0001

  a + b = 1 0000 0000

  在第一个输出语句中,a+b发生整形提升,a、b均提升为32位,不会发生溢出,输出a + b的值是255 + 1 = 256

  而将1 0000 0000赋值给只有8位的unsigned char c,c为 0000 0000,即0.

三、一个无限循环的例子

#include <stdio.h>
#include <conio.h> int main(int argc, char* argv[])
{
unsigned length = ;
int i = ;
for(; i < length - ; i++)
{
printf("in for\n");
}
getch();
return ;
}

length是unsigned int,所以length - 1的值为2^32-1即为unsigned int的最大值,int类型的i与unsigned int比较时整型提升,但其永远是小于等于2^32-1的。所以造成无限循环

C——整型提升的更多相关文章

  1. C语言的整型溢出问题

    整型溢出有点老生常谈了,bla, bla, bla… 但似乎没有引起多少人的重视.整型溢出会有可能导致缓冲区溢出,缓冲区溢出会导致各种黑客攻击,比如最近OpenSSL的heartbleed事件,就是一 ...

  2. 为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?

    在阅读<阿里巴巴Java开发手册>时,发现有一条关于整型包装类对象之间值比较的规约,具体内容如下: 这条建议非常值得大家关注, 而且该问题在 Java 面试中十分常见. 还需要思考以下几个 ...

  3. TensorFlow 模型优化工具包  —  训练后整型量化

    模型优化工具包是一套先进的技术工具包,可协助新手和高级开发者优化待部署和执行的机器学习模型.自推出该工具包以来,  我们一直努力降低机器学习模型量化的复杂性 (https://www.tensorfl ...

  4. 写出将字符串中的数字转换为整型的方法,如:“as31d2v”->312,并写出相应的单元测试,正则去掉非数值、小数点及正负号外的字符串

    写出将字符串中的数字转换为整型的方法,如:"as31d2v"->312,并写出相应的单元测试,输入超过int范围时提示不合法输入. public struct Convert ...

  5. 阿里云提示:对输入参数id未进行正确类型转义,导致整型注入的发生

    类似以下提示: XXX.php中,对输入参数id未进行正确类型转义,导致整型注入的发生 解决办法: 找到对应文件:$id = $_GET['id']; 增加以下标红过滤: $id = $_GET['i ...

  6. 整型信号量和PV操作(计算机操作系统)

    在整型信号量机制中,信号量被定义为一个整形变量.除初始化外,仅能通过两个标准的原子操作Wait(S)和Signal(S)来访问.其通常分别被称为P.V操作. 描述如下: P操作:S=S-1:如果S小于 ...

  7. 面试问题2:给一个5G的大文件,保存的数据为32位的整型,找到所有出现次数超过两次的数字

    问题描述:给一个5G的大文件,保存的数据为32位的整型,找到所有出现次数超过两次的数字 大数据操作: 解决方法一: 依次遍历文件数据, 开始32二进制清0 每次读取一个数,先和二进制位与,如果为0 则 ...

  8. GOLANG 基本数据类型 整型

    基本数据类型-整型 种类     有符号(负号)      int8 int16 int32 int64 无符号(无符号) uint8 uint16 uint32 uint64 架构特定(取决于系统位 ...

  9. python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串

    磨人的小妖精们啊!终于可以归置下自己的大脑啦,在这里我要把--整型,长整型,浮点型,字符串,列表,元组,字典,集合,这几个知识点特别多的东西,统一的捯饬捯饬,不然一直脑袋里面乱乱的. 对于Python ...

随机推荐

  1. 对魔兽世界、支付宝、Linux三类软件的简单分析

    软工第一次作业: 软件有很多种,如工具类软件.游戏类软件.系统类软件,它们的运行方式也各种各样,如以单机方式运行.以网站方式运行或者以APP方式运行在手机端等,请选取三种软件,分析它们各自的特点. 这 ...

  2. winform 移动窗体,和窗体阴影(引用)

    无边框窗体移动://窗体移动API [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [D ...

  3. System Setup

    vistual studio 2013 download: http://www.microsoft.com/en-us/download/details.aspx?id=48138 http://w ...

  4. java递归应用

    /** * 分配人员数据 * @param num 数据条数 * @param taskUs 人员数据 * @param isend 标记第一次循环 */private void distTaskNu ...

  5. SharePoint常用目录介绍

    SharePoint常用目录介绍 stsadm命令管理程序目录:C:\Program Files\Common Files\Microsoft Shared\web server extensions ...

  6. IIS设置session时长

    打开IIS管理器,选择要设置的session的网站,打开右边窗口的会话状态.选择状态服务器,设置连接字符串,并在服务管理开户状态服务 ASP.NET State Service

  7. linux实用命令语句

    du -sh ./* 作用:检索当前目录下的所有文件及文件夹的大小,或者"du -sh 文件名/*","du -sh 文件夹名/*"查看某个文件或文件夹的大小 ...

  8. Signatures of Mutational Processes in Human Cancer

    http://cancer.sanger.ac.uk/cosmic/signatures#

  9. get传中文参数乱码解决方法

    通常我们前端不同页面之间传参数用得最多的方法就是get方法:在url后面加上参数.例如:www.test.com?id=1&name=hello. 英文和字母很好处理,但是如果有的参数值为中文 ...

  10. Windows 更改桌面位置

    运行regedit HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders 找到 ...