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 ...
随机推荐
- JavaACOFramework的各个类介绍(part1 : Ant类)
public abstract class Ant extends Observable implements Runnable { public static int ANT_ID = 1; // ...
- UE4 使用UGM制作血条
声明:本文是自己做的项目,可能不是最好的方法,或有错误使用方式.各位不喜勿喷! HP进度 HP背景 将上面的资源拖到UE4中(使用UE4自带的颜色也可实现效果,具体参考官方教程 https://doc ...
- [SAP ABAP开发技术总结]选择屏幕——各种屏幕元素演示
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- centos7 docker zookeeper
docker run --name=zookeepertmp -i -t centos7/jdk7 /bin/bash cd /home wget http://apache.fayea.com/zo ...
- iOS textField输入金额的限制,小数点前9位,后面两位
iOS textField输入金额的限制,小数点前9位,后面两位,如果不加小数点,最大位数是9位,加上小数点,最大位数是12位,超出最大位数可删除 - (BOOL)textField:(UITextF ...
- 微信https请求工具类
工作中用到的微信https请求工具类. package com.gxgrh.wechat.tools; import com.gxgrh.wechat.wechatapi.service.System ...
- JFinal 国际化
要支持国际化,需要在容器初始化的时候配置一个处理国际化的全局拦截器.比如可以使用 com.jfinal.i18n.I18nInterceptor 配置拦截器: public class MppConf ...
- React之JSX
0.对于学习React,我们先来熟悉下JSX的语法, 下面的这些语法仅用于构建一个组件的标签模块,定义完成之后如果需要做演示,请附加以下代码: ReactDOM.render( element1, d ...
- I2C总线(异步)
起始位与停止位的定义: 起始信号:当SCL为高期间,SDA由高到低的跳变:启动信号是一种电平跳变时序信号,而不是一个电平信号. 停止信号:当SCL为高期间,SDA由低到高的跳变:停止信号也是一种电平跳 ...
- JavaScript中有关数字的精确计算
问题这样的: 37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) ,我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会 ...