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:强制转换时内存中的实际数据不变,具体表现出来的值按照目标数据类型的规则来计算。