C——整型提升
一、定义
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——整型提升的更多相关文章
- C语言的整型溢出问题
整型溢出有点老生常谈了,bla, bla, bla… 但似乎没有引起多少人的重视.整型溢出会有可能导致缓冲区溢出,缓冲区溢出会导致各种黑客攻击,比如最近OpenSSL的heartbleed事件,就是一 ...
- 为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?
在阅读<阿里巴巴Java开发手册>时,发现有一条关于整型包装类对象之间值比较的规约,具体内容如下: 这条建议非常值得大家关注, 而且该问题在 Java 面试中十分常见. 还需要思考以下几个 ...
- TensorFlow 模型优化工具包 — 训练后整型量化
模型优化工具包是一套先进的技术工具包,可协助新手和高级开发者优化待部署和执行的机器学习模型.自推出该工具包以来, 我们一直努力降低机器学习模型量化的复杂性 (https://www.tensorfl ...
- 写出将字符串中的数字转换为整型的方法,如:“as31d2v”->312,并写出相应的单元测试,正则去掉非数值、小数点及正负号外的字符串
写出将字符串中的数字转换为整型的方法,如:"as31d2v"->312,并写出相应的单元测试,输入超过int范围时提示不合法输入. public struct Convert ...
- 阿里云提示:对输入参数id未进行正确类型转义,导致整型注入的发生
类似以下提示: XXX.php中,对输入参数id未进行正确类型转义,导致整型注入的发生 解决办法: 找到对应文件:$id = $_GET['id']; 增加以下标红过滤: $id = $_GET['i ...
- 整型信号量和PV操作(计算机操作系统)
在整型信号量机制中,信号量被定义为一个整形变量.除初始化外,仅能通过两个标准的原子操作Wait(S)和Signal(S)来访问.其通常分别被称为P.V操作. 描述如下: P操作:S=S-1:如果S小于 ...
- 面试问题2:给一个5G的大文件,保存的数据为32位的整型,找到所有出现次数超过两次的数字
问题描述:给一个5G的大文件,保存的数据为32位的整型,找到所有出现次数超过两次的数字 大数据操作: 解决方法一: 依次遍历文件数据, 开始32二进制清0 每次读取一个数,先和二进制位与,如果为0 则 ...
- GOLANG 基本数据类型 整型
基本数据类型-整型 种类 有符号(负号) int8 int16 int32 int64 无符号(无符号) uint8 uint16 uint32 uint64 架构特定(取决于系统位 ...
- python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串
磨人的小妖精们啊!终于可以归置下自己的大脑啦,在这里我要把--整型,长整型,浮点型,字符串,列表,元组,字典,集合,这几个知识点特别多的东西,统一的捯饬捯饬,不然一直脑袋里面乱乱的. 对于Python ...
随机推荐
- Topcoder SRM 683 Div2 B
贪心的题,从左向右推过去即可 #include <vector> #include <list> #include <map> #include <set&g ...
- 首师大附中科创教育平台 我的刷题记录 3120 LJX的校园:入学典礼
今天给大家献上"C"级题:LJX的校园:入学典礼!! 试题编号:3120 LJX的校园:入学典礼 难度级别:C: 运行时间限制:45ms: 运行空间限制:256000K ...
- FMDB
一.FMDB简介 1.FMDB简介 iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较繁琐.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB. ...
- quantile normalization原理
对于芯片或者其它表达数据来说,最常见的莫过于quantile normalization啦. 那么它到底对我们的表达数据做了什么呢?首先要么要清楚一个概念,表达矩阵的每一列都是一个样本,每一行都是一个 ...
- jmeter+ant+jenkins+mac报告优化
一.在上篇博客中生成的报告有两个问题: 1.date not defined 2.Min Time和Max Time显示成了NaN 二.Jmeter+Ant报告生成原理: 在解决问题之前,让我们先弄清 ...
- Evolutionary Computing: 5. Evolutionary Strategies(1)
resource: Evolutionary computing, A.E.Eiben Outline What is Evolution Strategies Introductory Exampl ...
- mac下安装nginx+php+mysql+xdebug
一,安装homebrew 就像linux下面有yum一样,mac也有个homebrew,管理软件非常便捷. 官网:http://brew.sh/index_zh-cn.html 上面有句命令,复制下来 ...
- zookeeper能做什么?
Zookeeper是Hadoop的一个子项目,虽然源自hadoop,但是我发现zookeeper脱离hadoop的范畴开发分布式框架的运用越来越多.今天我想谈谈zookeeper,本文不谈如何使用zo ...
- js中对象 类 实例的区别 数据类型 创建对象
类是对象的具体细分,实例是类中的一个具体事物. 基本数据类型和 引用数据类型 基本数据类型:numble string undefined null 引用数据类型:对象和函数 对象数据类型又细分为:对 ...
- python——有一种线程池叫做自己写的线程池
这周的作业是写一个线程池,python的线程一直被称为鸡肋,所以它也没有亲生的线程池,但是竟然被我发现了野生的线程池,简直不能更幸运~~~于是,我开始啃源码,实在是虐心,在啃源码的过程中,我简略的了解 ...