C语言中隐式类型转换 截断和整型提升
C的整形算数总是至少以缺省整形类型的精度来进行的
为了获得这个精度 表达式中的字符和短整形操作数在使用之前被转换为普通整形 这种类型转换成为整型提升
给出代码实例↓
#include<stdio.h>
int main()
{
//char = signed char
char a = 3;
char b = 127;
char c = a + b;
printf("%d", c);
return 0;
}
正常来说结果为130 但是运行结果为什么是↓
为什么呢 这就牵扯到了整形提升(针对二进制的序列补码)
所谓的整形提升分为 有符号的 和 无符号的整形
对于有符号的最高位是0就补0 , 1就补1
无符号的全都补0
先从a看起3的普通整形是(4个字节)
a:00000000000000000000000000000011
但是a的类型是char (一个字节)此时就会发生截断保留后面八个比特位
a:00000011
b也是同样的原理 截断后
b:01111111
运算时 a,b会被提升为普通整形(32比特位)再进行运算
就会有
a:00000000000000000000000000000011
b:000000000000000000000000011111111
c:00000000000000000000000010000010
c是char类型 又会发生截断
c:10000010
%d是打印十进制的整数 c发生整形提升
11111111111111111111111110000010 补码
10000000000000000000000001111110 原码
二进制转换为十进制的结果位-126
#include<stdio.h>
int main()
{
//char = signed char
char a = 3;
//00000000000000000000000000000011
//截断
//00000011
char b = 127;
//00000000000000000000000001111111
//01111111
char c = a + b;
//00000011
//01111111
//整形提升
//00000000000000000000000000000011
//00000000000000000000000001111111
//00000000000000000000000010000010
//10000010
printf("%d", c);
//c整形提升
//11111111111111111111111110000010补码
//10000000000000000000000001111110原码
//-126
return 0;
}