隐式类型转换
//隐式类型转换
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
}
整形转换:整形提升
//无符号存储。整形提升
int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("%d,%d,%d\n", a, b, c);
}
浮点数存储中的强制类型转换:
//浮点数存储
int main()
{
int n = 9;
float* fp = (float*)&n;
printf("n:%d\n", n);
printf("*fp:%f\n", *fp);//转化为9.0; E全为0 输出0.0,我的理解就是发生了字节截断,因为占有内存不一样,从右开始占内存
*fp = 9.0;
printf("n:%d\n", n);//按整形解释打印9.0对应二进制序列的十进制
printf("*fp:%f\n", *fp);//浮点解释输出9.0
}
输出:
无符号输出:
//无符号输出
int main()
{
int a = -10;
printf("%d\n", a);
printf("%u\n", a);//无符号输出,-10的补码1111 1111 1111 1111 1111 1111 1111 0110输出4294967286
}
int main()
{
char a = -128;
printf("%u\n", a);
}
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);//无符号输出,0+(-1)=-1解释为11111111...转换成一个巨大的数,再继续--;
}
}
典型的数据溢出行为:
按照有符号char和无符号char的取值范围来计算:
#include<stdio.h>
int main()
{
char a[1000];//char:[-128,127]
int i;
for (i = 0; i < 1000; i++)//
{
a[i] = -1 - i;//-1+(-i)//[-1~-128] [127~0]用补码计算
}
printf("%d", strlen(a));//'\n'前有多少字符?256-1=255个
}
int main()
{
unsigned char i = 0;//无符号取值范围【0,255】
for (i = 0; i <= 255; i++)//256打印截断为0
{
printf("%d\n", i);//死循环0到255到0~.....
}
}