C语言小tip之整型提升

今天让我们来学习一下C语言中的一个小知识点-----整型提升

什么叫整型提升呢?

C语言中整型算术运算总是至少以缺省(默认)整型类型的精度来进行的。​为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。​

整型提升的意义

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。​

因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。​

让我们来看一段代码:

cpp 复制代码
#include<stdio.h>
int main ()
{
    char a = 5;
    char b =125;
    char c = a + b;
    printf("%d",c);
}

在VS中鼠标点在5上会显示int类型,所以a先要转换成int类型32个byte位即00000000000000000000000000000101(原反补相同),因为a的类型是char只占1个字节--8个byte(要发生截断)位即00000101同理b为01111101 。

在进行a + b的运算时,要进行整型提升因为该类型为有符号的char在进行整型提升的时候要按照符号位进行提升a由原来的00000101要变为00000000000000000000000000000101,b由原来的

01111101要变为00000000000000000000000001111101在进行相加,结果为00000000000000000

0000000010000010发生截断为10000010在进行打印的时候%d打印由符号的整数,同时也要进行整型提升,这时要注意要以符号位1来进行提升11111111111111111111111110000010转换为原码(取反加一)后为10000000 00000000 00000000 01111110,翻译后为-126。

今天介绍就到这里啦,拜拜。

相关推荐
阿豪学编程7 小时前
LeetCode724.:寻找数组的中心下标
算法·leetcode
墨韵流芳8 小时前
CCF-CSP第41次认证第三题——进程通信
c++·人工智能·算法·机器学习·csp·ccf
csdn_aspnet8 小时前
C# 求n边凸多边形的对角线数量(Find number of diagonals in n sided convex polygon)
开发语言·算法·c#
凌波粒9 小时前
LeetCode--349.两个数组的交集(哈希表)
java·算法·leetcode·散列表
我叫洋洋9 小时前
[Proteus 和 stm32f103c8t6]的使用控制OLED篇]
c语言·stm32·单片机·嵌入式硬件·蓝桥杯·proteus
paeamecium10 小时前
【PAT甲级真题】- Student List for Course (25)
数据结构·c++·算法·list·pat考试
Book思议-10 小时前
【数据结构】栈与队列全方位对比 + C 语言完整实现
c语言·数据结构·算法··队列
SteveSenna10 小时前
项目:Trossen Arm MuJoCo
人工智能·学习·算法
NAGNIP10 小时前
一文搞懂CNN经典架构-DenseNet!
算法·面试
道法自然|~10 小时前
BugCTF黄道十二宫
算法·密码学