1.类型转换规则
- char:-128~127
- unsigned char :0~255
- 如果大的数据放到小的内存,出现数据截断,保留小数据
- 由窄到宽:char ,short,int ,long ,float,long long ,double
- 整数的由窄到宽: char,short,int ,long ,long long
- 同级别无符号比有符号宽 (int 宽度< unsigned int)
- 整数默认为int,小数默认为double
- 1.默认由窄变宽,
- 2.运算的类型,int起
2.数据溢出
标准规定,有符号位,最高位为符号位,0+1-,请注意如果是无符号位,所有位都是数值。
int main()
{
char a = 200; //-128~127 200->0xc8->1100 1000 有符号的符号位为1说明是负数
//绝对值:取反+1,0011 1000 -> -56
unsigned char b = -1;//-1->二进制全1->1111 1111 在unsigned全是数值->255
printf("%d,%d\n",a,b);
return 0;
}
char类型的范围是-128-127,上述代码char a = 200;超出了char类型的数据范围,200转换为二进制为1100 1000 有符号的符号位为1说明是负数,将其绝对值取反+1,得到0011 1000 -56,即a中保存的数据以十进制整数输出为-56。
int main() {
char a = -1;
char b = 255;//超范围,二进制1111 1111->-0000 0001(符号位为1,负数,取绝对值,取反加1)->-1
unsigned char c = -1;//二进制1111 1111->255
unsigned char d= 255;
printf("%d %d %d %d",a, b, c, d);
return 0;
}
a为整型,范围~
,-1没有超出此范围,不发生类型转换。
b为char类型,范围-128~127,255超出此范围,发生类型隐式转换,
255的二进制为1111 1111,有符号的符号位为1说明是负数,将其绝对值取反+1为1000 0001,值为-1。
c、d均为无符号char类型,范围0~255,-1超出此范围,发生类型隐式转换,
-1的二进制为1111 1111,无符号位的,所有位都是数值,即c的值为255;d的值为255,未超出范围。
3.向更宽的范围对齐
int main() {
//-1->10000000 00000000 00000000 00000001->111111111 111111111 111111111 11111111
unsigned int a = 10;
if (a > -1)//unsigned int>int->unsigned int>unsigned int->10>2^31(-1)
printf("a>-1");
else
printf("a<-1");
unsigned short b = 10;//00000000 00001010
if (b > -1)//unsigned short>int->int>int->10>-1
printf("b>-1");
else
printf("b<-1");
}
上述代码中a为无符号整型,-1默认为整型,同级别无符号比有符号,所以类型转换过程如下:
-1由整型转换为无符号整型:
-110000000 00000000 00000000 00000001
111111111 111111111 111111111 11111111
隐式转换过程:
unsigned int>intunsigned int>unsigned int
10>
,结果为假,打印a<-1。
b为无符号短整型,-1默认为整型,整型比短整型范围更宽,类型转换过程如下:
b的二进制表示:00000000 00001010
隐式转换过程:
unsigned short>intint>int
10>-1,结果为真,打印b>-1。
更多举例
int main(){
char a = 'a' + 1;//char + int -> int+int -> char
printf("%c\n",a);
int b = 'a' + 1;//char自动提升为int
char c = 0x12;
char d = 8;
printf("%x\n",c<<d);//char<<int -> int <<int ->0x00000012<<8->0x00001200
return 0;
}