数据类型转换的本质原因有两个:
1、窄变宽:左边补符号位
例子:
#include<stdio.h>
int main()
{
char a=-1; // 1111 1111
char b=1; // 0000 0001
unsigned char c=1; // 0000 0001
unsigned char d=255; // 1111 1111
int e=a; //整形四字节,32位,符号位为1,因此左边补符号位为1111 1111 1111 1111 1111 1111 1111 1111
printf("%d,%x\n",e,e);
int e=b; //符号位为0,因此左边全补0为0000 0000 0000 0000 0000 0000 0000 0001
printf("%d,%x\n",e,e);
int e=c; //无符号型符号位为0,因此左边全补0为0000 0000 0000 0000 0000 0000 0000 0001
printf("%d,%x\n",e,e);
int e=d; // 同理无符号型符号为0因此给左边补0为0000 0000 0000 0000 0000 0000 1111 1111
printf("%d,%x\n",e,e);
}
2、宽变窄:保留低数据
#include<stdio.h>
int main()
{
int a=0x12345678;
int b=0xff347890;
char c=a; //0x78 0111 1000
char d=b; //0x90 1001 0000 ,0111 000
printf("%d,%x\n",c,c); 120,78
printf("%d,%x\n",d,d); 符号位为-1取反+1得答案为 -112,ffffff90
return 0;
}