在C语言中,通常会在数据类型转换方面出现问题,以下对数据类型转换进行说明。
先看一段代码,如下:
int main()
{
char a = -1;
char b = 255; //char类型取值范围:-128~127 255二进制:1111 1111即为-1
unsigned char c = -1; //无符号char类型取值范围0~255,1111 1111即为255
unsigned char d = 255;
unsigned int n = -1; //11111111111111111111111111111111即为2^32 - 1
int e = a; //-1 char->int
int f = b; // -1 char->int
int g = c; //255 unsigned char->int
int h = d; //255 unsigned char->int
printf("%d,%d,%d,%d\n",e,f,g,h);
int e = -1; //-1
int f = 255; //255
printf("%d,%d\n",e,f);
return 0;
}
如上所示代码,为不同数据类型之间的转换。其中有符号和无符号的差别以及宽窄类型差别,转换规则不同。
数据类型之间默认转换规则:
1.从窄的类型转成宽类型;
2.同类型的无符号比有符号宽(考的多)
3.整型起(数字默认为int,浮点默认为double)
( 其中同级别的数据类型遵循规则: unsigned int > int )
( 只要是二进制左边补数据都是补符号位,无符号则补0,右边补数据都是补0 )
4.窄类型转宽类型:左边统一补符号位,无符号则补0
//应用
int main()
{
char a = 10; //0000 1010
int b = a; //10,(32位)000000000000000000000000 0000 1010 补符号位
a = -1; //-1 1111 1111
b = a; //-1 (32位) 111111111111111111111111 11111111 补符号位
unsigned char c = 10; //0000 1010
b = c; //10
c = 255; //255 1111 1111
b = c; //255 (32位)000000000000000000000000 1111 1111 无符号补0
return 0;
}
如下是较为复杂的数据类型转换。 转换规则遵循规则4以及同级别类型转换规则。
int main()
{
char i = 10;
int j = 2000;
j = i;
i = 2000;
printf("%d\n",sizeof('a'+1));
unsigned short a = 10;
unsigned int b = 10;
if(a > -1) // unsigned short > int -> (int > int)
{
printf("a>-1\n");
}
else
{
printf("a<-1\n");
}
if(b > -1) //unsigned int > int->(unsigned int > unsigned int)
{
printf("b>-1\n");
}
else
{
printf("b<-1\n");
}
return 0;
}
运行结果如下:
以上为数据类型转换的想法,有问题还请指教。