如何查看网站的关键词,常州网站建设公司报价,怎样创建网站详细步骤,网站模版整站下载【C语言】你不知道的隐式类型转换规则 一、隐式类型转换的规则二、整型提升1.整型提升的意义2.如何进行整体提升#xff1f;2.1正数的整形提升2.2负数的整型提升2.3无符号整型提升 3.整型提升实例 三、算术转换 #x1f388;个人主页#xff1a;库库的里昂#x1f390;CSDN… 【C语言】你不知道的隐式类型转换规则 一、隐式类型转换的规则二、整型提升1.整型提升的意义2.如何进行整体提升2.1正数的整形提升2.2负数的整型提升2.3无符号整型提升 3.整型提升实例 三、算术转换 个人主页库库的里昂CSDN新晋作者欢迎 点赞✍评论⭐收藏✨系列专栏C语言初阶、代码小游戏希望作者的文章能对你有所帮助有不足的地方请在评论区留言指正大家一起学习交流 【前言】 本文接着C语言中的操作符万字详解讲解隐式类型转换规则还有没学操作符的老铁可以回头看看。在 C 语言中类型转换的方式一般可分为隐式类型转换和显示类型转换也称为强制类型转换。其中隐式类型转换由编译器自动进行不需要程序员干预。隐式类型转换通常有两种情况整形提升和算术转换。 一、隐式类型转换的规则 在C语言中自动类型转换遵循以下规则 若参与运算量的类型不同则先转换成同一类型然后进行运算。转换按数据长度增加的方向进行以保证精度不降低。如int型和long型运算时先把int量转成long型后再进行运算。 a、若两种类型的字节数不同转换成字节数高的类型 b、若两种类型的字节数相同且一种有符号一种无符号则转换成无符号类型所有的浮点运算都是以双精度进行的即使仅含float单精度量运算的表达式也要先转换成double型再作运算。char型和short型参与运算时必须先转换成int型。在赋值运算中赋值号两边量的数据类型不同时赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时将丢失一部分数据这样会降低精度丢失的部分按四舍五入向前舍入。
二、整型提升
C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度表达式中的字符和短整型操作数在使用之前被转换为普通整型这种转换称为整型提升。
1.整型提升的意义 表达式的整型运算要在CPU的相应运算器件内执行CPU内整型运算器(ALU)的操作数的字节长度。 一般就是int的字节长度同时也是CPU的通用寄存器的长度。 因此即使两个char类型的相加在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。 通用CPUgeneral-purpose CPU是难以直接实现两个8比特字节直接相加运算虽然机器指令中可能有这种字节相加指令。所以表达式中各种长度可能小于int长度的整型值都必须先转换为int或unsigned int然后才能送入CPU去执行运算。 代码示例
char a,b,c;
a b c;b和c的值被提升为普通整型然后再执行加法运算。 加法运算完成之后结果将被截断然后再存储于a中。
2.如何进行整体提升 整形提升是按照变量的数据类型的符号位来提升的 2.1正数的整形提升 高位补充符号位即补0 char c2 1;
变量c2的二进制位(补码)中只有8个比特位
00000001
因为 char 为有符号的 char //VS中默认char为有符号char
所以整形提升的时候高位补充符号位即为0
提升之后的结果是
000000000000000000000000000000012.2负数的整型提升 高位补充符号位即补1 char c1 -1;
变量c1的二进制位(补码)中只有8个比特位
1111111
因为 char 为有符号的 char
所以整形提升的时候高位补充符号位即为1
提升之后的结果是
111111111111111111111111111111112.3无符号整型提升 高位补0 3.整型提升实例
代码示例1
#includestdio.h
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结果分析 实例1中的a,b要进行整形提升,但是c不需要整形提升 a,b整形提升之后,变成了负数,所以表达式 a0xb6 b0xb600的结果是假,但是c不发生整形提升,则表达式 c0xb6000000 的结果是真. 代码示例2
#includestdio.h
int main()
{char c 1;printf(c%u\n, sizeof(c));//%u按无符号整形unsigned int打印printf(c%u\n, sizeof(c));printf(c%u\n, sizeof(-c));return 0;
}c1
c4
c4实例2中的,c只要参与表达式运算,就会发生整形提升,表达式 c ,就会发生提升,所以 sizeof(c) 是4个字节。 表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof© ,就是1个字节。 三、算术转换 如果某个操作符的各个操作数属于不同的类型那么除非其中一个操作数的转换为另一个操作数的类型否则操作就无法进行。下面的层次体系称为寻常算术转换。 //排名由高到低
long double
double
float
unsigned long int
long int
unsigned int
int如果某个操作数的类型在上面这个列表中排名较低那么首先要转换为另外一个操作数的类型后执行运算。
警告 但是算术转换要合理要不然会有一些潜在的问题。
代码示例
#includestdio.h
int main()
{float f 3.14;int num f;//隐式转换会有精度丢失printf(num%d,num);
}代码结果
num3结果分析 在赋值运算过程中当两边的数据类型不一样时右边的数据将强制转换为左边的数据即float类型的b将强制转会为int类型小数点后面的部分直接丢弃导致精度下降。 【小结】 如果不了解整形,c偷偷将你的数据类型改变了你都不知道。 我想大家应该了解整形提升了吧,下次c再偷偷改我们的类型,我们虽然不能阻止,但是却可以知道了吧 今天讲的隐式类型转换就到这里啦