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 ...
随机推荐
- POJ 3233 Matrix Power Series(构造矩阵求等比)
Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak. ...
- Python 学习随笔1
在一个列表中,找出重复数组的位置. 比如在列表name = [1, 5, 8, 22, 56, 2, 8, 45, 7, 2, 35, 2, 486, 2, 152, 111, 265, 2, 2]中 ...
- Expression2Sql的一些语法更新
前言 前一阵子给大家介绍了一个可以将Expression表达式树解析成Transact-SQL的项目Expression2Sql. 之后得到了广大读者的一些好评,也使得博主更有动力继续更新下去,然后一 ...
- eclipse gradle插件(buildship)的安装和使用
一.下载gradle https://gradle.org/gradle-download/ 二.手动安装gradle插件 我选择的是buildship,经过实际使用,体验很好. 插件的下载地址是: ...
- div盒子中子元素(子元素可能是盒子, 图片) 中居中的三种方法
- a error of misunderstanding
Last summer vacation, a classmate contacted with me and we finished a intelligent car project with i ...
- 《与小卡特一起学Python》 Code2
下边是一个猜数字的小游戏: 几乎所有语言都这样做的…… here we go! import random secret = random.randint(1,99) guess = 0 tries ...
- 关于Tomcat在eclipse上的配置
一:安装JDK(建议版本比较新的jdk,因为有很多集成于jdk软件需要的jdk版本比较高): jdk官网下载位置:http://www.oracle.com/technetwork/java/java ...
- google play下载apk
http://apps.evozi.com/apk-downloader/ 输入apk下载地址
- nslookup
检查DNS http://arch.pconline.com.cn//pcedu/soft/wl/assist/10307/193330.html