Type conversions in C are much more widespread than is generally realized. They can also occur in any expression that involves a type smaller than int or double. Take the following code, for example:

int main(int argc, char *argv[])
                {
                //  printf(" %d ", sizeof 65);
                	printf(" %d ", sizeof 'A');
                
                	system("pause");
                	return 0;
                }
                

如上代码,输出可能是 1,也可能是 4。如果 'A' 按字面理解是 char,而 'A' 的 ASCII 是 65,是一个 int,所以输出结果因编译器而异。这就是类型提升——此例中 char 类型被提升为 int 类型,GCC 下输出 4,VS 下输出 1。

类型提升规则如下:

正负转换示例


                int main(int argc, char *argv[])
                {
                
                	char a, b, c;
                	a = 'a';
                	b = 'b';
                	c = a + b;
                
                
                	//195=11000011
                	//  00111101
                
                	cout << (int)(char)(0xc3);
                
                	system("pause");
                	return 0;
                }
                

由于 + 运算,根据提升规则,char 被提升为 int,结果是 int 的 195。195 = 0xc3,赋值给 char 后二进制为 11000011,取反加一变为 00111101,加上负号,结果为 -61。同理:


                int main(int argc, char *argv[])
                {
                	cout <<( int) ( char)(0xff) ;
                	return 0;
                }
                

转换为 char 后,取反加一为 00000001,加上负号,输出 -1。

字节宽度转换规则

  • 小字节转换为大字节:高位补 0
  • 大字节转换为小字节:截断
int main(int argc, char *argv[])
                {
                 	cout << (int)(char)(0xff)<<endl;
                	cout << (int)(char)(0x7fff) << endl;
                	cout <<(int) (char)(int)(0x7fff) << endl;
                	return 0;
                }

Tip:强制转换时内存中的实际数据不变,具体表现出来的值按照目标数据类型的规则来计算。