在c/c++中不同类型数据运算时会隐式的转化到更大数据类型进行运算,所以有时运行结果很令人费解。
#include <iostream>
#include <string>
using namespace std;
int main()
{
short s = 'a';
unsigned int ui = 1000;
int i = -2000;
double d = i;
cout << "d = " << d << endl;
cout << "ui = " << ui << endl;
cout << "ui + i = " << ui + i << endl;
if ((ui + i) > 0) //当一个unsigned int数和一个int相加时 会将进行运算的两个数隐式的转化为unsigned int后在进行相加 所以输出一个很大的整数
{
cout << "Positive" << endl;
}
else
{
cout << "Negative" << endl;
}
//当char与short类型进行运算,会隐式的转化为int类型 所以输出4
//之所以会转化为int 因为对于编译器来说int类型的运算更加高效
cout << "sizeof(s + 'b') = " << sizeof(s + 'b') << endl;
return 0;
}
gcc中运行结果为
d = -2000
ui = 1000
ui + i = 4294966296
Positive
sizeof(s + 'b') = 4
vc++中运行结果为
d = -2000
ui = 1000
ui + i = 4294966296
Positive
sizeof(s + 'b') = 4
隐式转换:进行表达式运算时,不同数字的数据类型不同,gcc编译器会自动转换为相同的数据类型之后,再进行运算(其实就是先转换为二者中的高级的再进行运算)。 隐式转换:低级–>高级 隐式转换:
-
内存小–>内存大
-
整型数据类型–>浮点数据类型
-
有符号–>无符号
显式转换:目标类型变量=(目标类型)源类型变量;
#include <stdio.h>
int main(void) {
//由于里面有0.9小数,gcc编译器把它默认当成double类型(8字节),gcc自动将int类型的1转换成double类型的1
printf("sizeof(1?1:0.9)的结果是%lu\n", sizeof(1?1:0.9)); //8
//gcc编译器把-7和3都当成int类型,无需数据类型转换,直接运算-4显然小于0,结果为0假
printf("-7 + 3 > 0的结果是%d\n", -7 + 3 > 0); //0
//由于里面有3u,gcc把它当成无符号类型,所以gcc自动将-7有符号转为无符号的数字(肯定是正数)再和3做加法
//显然结果大于0,结果为1真
printf("-7 + 3u > 0的结果是%d\n", -7 + 3u > 0); //结果为1
printf("(char)300强转结果是%d\n", (char)300);
int a = 555;
char b = (char)a; //char -127,128 unsigned char 0,255
printf("a = %d, b = %d\n", a, b);
int c = 520;
long d = (long)c; //小转大:int:4字节,long:8字节
printf("c = %d, d = %ld\n", c, d);
return 0;
}