前言
🎈大家好,我是何小侠🎈
🌀大家可以叫我**小何或者小侠🌀**
🔴我是一名普通的博客写作者🔴
💐希望能通过写博客加深自己对于学习内容的理解💐
🌸也能帮助更多人理解和学习🌸
🍃我的主页:何小侠的主页🍃
这篇博客我们一起来学习C语言中的整型提升,这对我们理解内存很有好处。
整型提升🍊
在C语言中经常会遇到类型转换,比如说
这张图中并没有包含,short 和 char 类型,是因为它们都会在需要隐式类型转换转换为 int。
那为什么需要整型提升呢?
也就是整型提升到底好在哪里?
在CPU中会有相应的运算器执行整型的运算过程,而这个运算器(ALU)的操作数的字节长度一般就是int 的字节长度,同时也是CPU通用寄存器的长度。
因此小于int字节数的两个类型,char short 需要在先转换为int再执行运算。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。
所以,表达式中各种长度可能小于int长度的整型值,
都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。
例子🍊
//例1 char a,b,c; ... a = b + c;
如果两个char 类型相加就会先整型提升,再相加,再加法完之后还会发生截断再存储在a中,因为a中只能存储8个比特位。当然对算术运算都是符合的。
再看
到底如何整型提升🍊
整型提升是按照变量的数据类型的符号位来提升的
无符号整形提升,高位补0,有符号整型提升,高位补充符号位
这就是我们整型提升最重要的一点
来看看一个例子
int main() { char a = -1; int b = 1; int c = a + b; printf("%d", c); return 0; }
这里就发生了int = char + int ,这个时候就需要发生整型提升。
但是我们要先补充一个知识
int main() { char a = -1; int b = 1; int c = a + b; printf("%d", c); return 0; }
下面就是详细的讲解
一定要记住什么时候要截断,什么时候要提升,提升要按照符号位提升。
我们再来看看一个例子
int main() { char c1 = 3; char c2 = 127; char c3 = c1 + c2; printf("%d\n", c3); return 0; }
这里是char = char + char。
最后还需要按照%d形式打印
再来一个例子
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; }
我们还是慢慢来,逐渐习惯分析,当分析与结果一致是很快乐的。
最后一个例子:
int main() { char c = 1; printf("%u\n", sizeof(c)); printf("%u\n", sizeof(+c)); printf("%u\n", sizeof(-c)); return 0; }
与之前的几个例子一样思路即:
第一个printf不会发生整型提升,但是在后两个中,由于±符号的添加,需要表达式运算范畴,
所以sizeof(+c) 就是4个字节 ,sizeof(-c)也是4个字节。
总结🍊
这篇博客我们系统的介绍了C语言中整型提升的知识点,我觉得这对我们对于内存的理解是非常好的,无论是分析还是调试都显的更清晰了。
最后如果这篇博客有帮助到你,欢迎点赞关注加收藏
如果本文有任何错误或者有疑点欢迎在评论区评论