整型提升的讲解及举例应用

文章目录

    • 什么是整型提升
    • 整型提升适合应用的情况
    • 整型提升的目的
    • 整形提升的原理
    • 加深理解
    • 小结

什么是整型提升

在C语言中,整型提升(integer promotion)是指当进行表达式运算时,比较小的整数类型会自动转换成较大的整数类型。这种类型转换是根据C语言的类型提升规则执行的,目的是为了保证表达式中的操作数具有相同的类型。

整型提升适合应用的情况

整型提升适用于以下情况:

① 当使用算术运算符(如加法、减法、乘法、除法)时,参与运算的操作数将自动进行整型提升。比如,如果一个操作数是int类型,另一个操作数是char类型,那么char类型的操作数将被提升为int类型。
②当使用位运算符(如按位与、按位或、异或)时,参与运算的操作数也会自动进行整型提升。
③当使用关系运算符(如大于、小于、等于)时,比较的操作数也会进行整型提升。

整型提升的目的

整型提升的目的是为了避免由于不同的整数类型在内存中占用的空间大小不同而导致的错误或不一致的结果。通过将较小的整数类型提升为较大的整数类型,可以确保在表达式中的操作数都具有相同的类型,从而避免类型不匹配的问题。

整形提升的原理

举例剖析

#include 
int main()
{
char a=-1;
signed char b=-1;
unsigned char c=-1;
printf("%d %d %d",a,b,c);
return 0;
}

整型提升的讲解及举例应用_第1张图片
我们可以看到输出是a=-1,b=-1,c=255是什么原因导致了这个结果呢,就是整型提升。
分析如下:

a的原码,反码,补码分别为:
1000000 00000000 00000000 00000001 原码
11111111 111111111 111111111 111111110 反码
11111111 111111111 111111111 111111111 补码
但是char类型只能储存8个位置
所以 11111111------a

我们还可以看见输出是以%d的形式输出a,所以这时要进行整型提升,a是char a,是默认有符号的,所以最高位1为符号位

进行整型提升时我们前面全补1,补成32位
即11111111 11111111 11111111 11111111
这是反码,其原码代表的值为-1.

同时,不过没有标注有无符号,默认就是有符号的
所以,char 和 signed char是一样的
所以 11111111------b

剩下的部分与a相同

c就与a和b不同了
到8个比特位为止,都一样
c也是储存的8个1
11111111-----c

但是,c时unsigne char,是一个无符号的数
其整型提升时补0,而不补1
变成 00000000 00000000 00000000 11111111

这时首位为0,是正数,正数的原码反码补码相同,所以此数为255.

加深理解

看完了上述的例子和剖析原理,下面我们再那一道题加深理解。

#include
int main()
{
char a=-128;
printf("%u/n",a);

return 0;
}

整型提升的讲解及举例应用_第2张图片
我们可以看到竟然输出了一个超级大的数字,这是为什么呢?
分析如下:

首先我们要知道 %u是以10进制的形式,打印无符号的整数。 %d是以10进制的形式,打印有符号的整数。
a的原码,反码,补码如下
10000000 00000000 00000000 10000000 原码
11111111 11111111 11111111 01111111 反码
11111111 11111111 11111111 10000000 补码

但是char类型只能储存8个 所以 10000000-----a
char是有符号的类型,所以整型提升前面补1,整型提升结果如下
11111111 11111111 11111111 10000000

此时输出为%u,是一个无符号数,所以首字符1不是符号位
即这一个正数,那么它的原码反码补码相同
11111111 11111111 11111111 10000000次数化为进制即是4294967168

小结

在整型提升中,需要注意以下几个方面:

① 自动类型提升:当进行运算时,参与运算的整型数值会自动提升为较大的类型(比如int提升为long)。
②有符号整型提升:有符号整型会在扩展时,将最高位的符号位进行复制。例如,将一个有符号的8位整数提升为16位整数时,符号位将被复制至高8位。
③无符号整型提升:无符号整型在提升时,会在高位补0。例如,将一个无符号的8位整数提升为16位整数时,高8位将被补0。
④类型转换:将一个大范围的整数类型转换为一个较小范围的整数类型时,高位的部分可能会被截断,导致数据丢失。因此,在进行类型转换时需要注意数据溢出的情况。
⑤存储范围:整型提升可能会导致数值超过存储范围,从而产生溢出或不确定的结果。特别是在进行算术运算时,需要注意结果是否会超出存储范围。
⑥带符号和无符号整型之间的转换:在带符号整型和无符号整型之间进行转换时,需要注意符号位的处理。如果将带符号整型转换为无符号整型,可能会导致符号位被解释为数值位,从而改变数值的含义。反之亦然,将无符号整型转换为带符号整型时,可能会导致数值位被解释为符号位,从而改变数值的正负。

希望大家看了之后能够有所收获,感谢大家的支持!

你可能感兴趣的:(c语言,开发语言,算法)