经验规则
1、 在32位机上,int型和unsignedint型都是32位的(4个字节)。
2、 enum会跟据最大值来决定类型,一般来说为int型,如果超出int型所能表示的范围,则用比int型大的最小类型来表示(unsigned int, long 或者unsigned long)
3、 关于类型的大小。一般用所能表示的数据范围来比较类型的大小,如char型<unsigned char型<short型...在表达式中,一般都是由小的类型向大的类型转换(强制类型转换除外)
4、 所有比int型小的数据类型(包括char,signedchar,unsigned char,short,signed short,unsigned short)转换为int型。如果转换后的数据会超出int型所能表示的范围的话,则转换为unsigned int型;
5、 bool型转化为int型时,false转化为0,true转换为1;反过来所有的整数类型转化为bool时,0转化为false,其它非零值都转为true;
6、 如果表达式中混有unsignedshort和int型时,如果int型数据可以表示所有的unsigned short型的话,则将unsigned short类型的数据转换为int型,否则,unsigned short类型及int型都转换为unsigned int类型;7、 unsigned int 与long类型的转换规律同3;
8、 如果表达式中既有int 又有unsignedint,则所有的int数据都被转化为unsigned int类型;
9、 始终要牢记内存中的表示,至于printf或者强制类型转换都只不过是对数的不同解释。如将有符号低精度数转换为高精度时,符号位向上扩展,如果是无符号低精度转换为高精度时,高位补0即可。如下程序所示。与此对应的是,如果是高精度转换为低精度时,那么只会装载高精度的相应低位,无论该数为signed 或是unsigned。
<span style="font-size:18px;">#include <stdio.h>
int main(void)
{
unsigned char a = -1;
char b = a;
printf("%d %d\n", a, b); //输出255和-1
unsigned int c = -1; //c的内存为FFFFFFFF
int d = c;
printf("%d %d\n", c, d); //输出-1和-1,只需要根据内存来看
}</span>
主要参考文献:http://weihe6666.iteye.com/blog/1055570
http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html