C语言中的整型提升
Posted 不倒翁*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中的整型提升相关的知识,希望对你有一定的参考价值。
C语言中的整型提升
提到整型提升,可能刚学c语言的小伙伴们很头疼这个知识点吧,下面我就我的理解简单分析一下整型提升是怎么回事.
首先还是介绍一下整型提升的概念:
c的整型算术运算总是至少以缺省整型类型的精度来进行的. 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升.
整型提升是按照变量的数据类型的符号位来进行提升的.
可能小伙伴们看到这个说明还是一头雾水,那么下面我通过一个具体的例子来说说整型提升到底是怎么回事.
(注意看我里面注释的说明哦)
int main()
char a=3;
//00000000 000000000 00000000 00000011 //3的16进制
//00000011 -a 因为a是char类型的,所以a中只能放一个字节
char b=127;
//00000000 000000000 00000000 01111111
//01111111
char c=a+b;
//a和b要相加的话首先被提升为普通整型,然后再执行加法运算
//a发生整型提升后的结果:
//0 00000000 00000000 00000000 0000011 符号位为0,
// 在0后面补全32位来进行提升
//b发生整型提升后的结果:
//0 00000000 00000000 00000000 1111111
//a+b=00000000 000000000 00000000 00000011
// +00000000 000000000 00000000 01111111
// =00000000 000000000 00000000 10000010
//所以c=10000010
//因为内存中的数据都是以补码的形式存放在内存中的
//且打印的是%d,就是以十进制形式打印,所以这里就会发生整型提升
//c进行整型提升 1 11111111 11111111 11111111 0000010 (补码)
//因为首位为1,所以符号位为1,在1后面补全32位来进行提升
// 反码:1 11111111 11111111 11111111 0000001
// (反码等于补码减1)
// 源码:1 00000000 00000000 00000000 1111110
// (源码=反码的符号位不变,其他位取反)
printtf("%d\\n",c); //所以结果为-126
return 0;
仔细看完上面,是不是对整型提升有了一些更清楚的了解呢.下面来看看这个题
int main()
char a=0xb6;
short b=0xb600;
int c=0xb6000000;
if(a==0xb6)
printf("a");
if(b==0xb600)
printf("b");
if(c==0xb6000000)
printf("c");
return 0;
上面这段代码会打印哪几个字母呢? 你们可以自己先好好思考一下.
打印结果只有c, a和b不打印,原因是 ==号相当于发生算术运算,所以a和b发生了整型提升 那么a和b发生整型提升后的数值为多少呢?
下面我在来分析一下a发生整型提升的过程:
首先a=0xb6, 写成二进制就是:10110110
然后可以看出符号位为 1, 接着就是在1 的后面补齐1到32位,即:
1 11111111 11111111 11111111 0110110 (补码)
接着我们把补码转换为源码
1 11111111 11111111 11111111 0110101 (反码)
1 0000000 0000000 0000000 1001010 (源码)
所以a = 01001010; (取后面8个bit位,因为char类型只能放入一个字节),所以这里的a是不会打印的. 同理 你们可以自己去分析一下b.
分析了整型提升是怎么回事,那么到底什么时候会发生整型提升呢?相信很多人还是一头雾水.
所以记住这句话就行, 当char类型和short类型的数据,只要参与了表达式运算,那么就会发生整型提升
下面再来看个例子:
int main()
char c=1;
printf("%d\\n", sizeof(c));
printf("%d\\n", sizeof(+c));
printf("%d\\n", sizeof(!c));
return 0;
这里打印的结果为 1, 4, 1
为啥第二行打印的结果为4呢?
因为表达式+c中,c参与了表达式运算,发生了整型提升,所以它的大小就变成了4个字节.
看完后,如果对你有帮助记得关注下哦,有不懂的也可以在评论区说说.
以上是关于C语言中的整型提升的主要内容,如果未能解决你的问题,请参考以下文章