代码出现的整数字面值默认为int,浮点字面值默认为double。1.1为double型。
char a = 1; //1为int型
float a = 0.1; // 0.1为double型
int i = 0x8000000f; //这里的0x8000000f为int型数据的补码形式.
printf("%d %x\n", i, i); //输出:-2147483633 8000000f
//可见printf()中的格式控制符%x也是输出数据的补码形式。
c语言数据类型的自动转换遵循以下规则:
1)若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
2)转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。
a.若两种类型的字节数不同,转换成字节数高的类型
b.若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
3)所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
4)在表达式中,char和short类型的值,无论有符号还是无符号,都会自动转换成int或者unsignedint(如果short的大小和int一样,unsignedshort的表示范围就大于int,在这种情况下,unsignedshort被转换成unsignedint)。因为它们被转换成表示范围更大的类型,故而把这种转换称为“升级(promotion)”。
5) 对于signed类型的扩展,看该数据的最高位,为1,则扩展的所有位都为1,为0,则扩展的位都为0
对于unsigned signed类型的,所有扩展的位都为0
6)在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。
转换规则如下图所示。
double←── float高
↑
long
↑
unsigned
↑
int←── char,short低
图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。纵向箭头表示当运算符两边的运算数为不同类型时的转换,如一个long型数据与一个int型数据一起运算,需要先将int型数据转换为long型,然后两者再进行运算,结果为long型。所有这些转换都是由系统自动进行的,使用时你只需从中了解结果的类型即可。
示例:
/**********************************************************************
* Compiler: GCC
* Last Update: Fri 20 Apr 2012 12:12:56 AM CST
************************************************************************/
#include <stdio.h>
int main(int argc, char **argv)
{
int a = -1;
unsigned int b = 1;
char c = 0x86; //char为有符号8位整型,0x86其实是负数
char d = 0xf4;
//当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型
//即无符号数比有符号数高级
if(a > b){
printf("(int)-1 > (unsigned int)2\n");
}
printf("%x\n", (unsigned int)-2); //-2转换成无符号数后比1大
printf("%x\n", d + ((unsigned char)c << 8)); //本来以为会输出0x86f4,但结果是0x85f4
//先将c转换成无符号unsigned char: 0x86,然后系统会将其自动扩展成
//unsigned int: 0x00000086, 左移8位后变成0x00008600
//系统也会对d进行自动扩展成unsigned int: 0xfffffff4
//0x00008600 + 0xfffffff4 = 0x000085f4
//对于signed类型的扩展,看该数据的最高位,为1,则扩展的所有位都为1,为0,则扩展的位都为0
//对于unsigned signed类型的,所有扩展的位都为0
printf("%x\n", c << 8);
printf("%x\n", (unsigned char)0x86 << 8);
return 0;
}
/**********************************************************************
* Compiler: GCC
* Last Update: Sat 28 Apr 2012 10:37:47 PM CST
************************************************************************/
#include <stdio.h>
int main(int argc, char **argv)
{
char a = -1;
printf("%c\n", a - 129);
//char参与运算,转换成int
//-1 -129 = 130
//130的补码形式是0xffffff7e
//char为8位,故截短,取低8位,即0x7e
//0x7e的ASCII码是 ~
return 0;
}
~
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
来自:http://bbs.ednchina.com/BLOG_ARTICLE_116361.HTM
http://www.cnblogs.com/jpcflyer/archive/2012/02/16/2353447.html
http://learn.akae.cn/media/ch15s03.html