隐式类型转换 算术转换 操作符的属性

隐式类型转换

c的整形算术运算总是至少以缺省整型类型的精度来计算的
为了获得这个精度,变浓的是的字符和短整型的操作数在被使用前被转换为普通型,这中类型转化被称为整型提升
整形提升的意义:
表达式的整形运算实在cpu的相应的运算器内执行,cpu内整形运算的操作数的字节长度一般就是int长度的字节,同时也是cpu内整形操作数的标准长度
因此。即使两个字符类型相加,在cpu执行时实际也是先转化为cpu内整型操作数的标准长度。
通用cpu是难以直接实现两个8比特字节的直接相加运算。所以表达式各种长度小于int长度的整型值,都必须先转化为int或unsigned int才能进入cpu内运算。

如:char a, b, c;
.....
a = b+c;
这里的b和c先会被提升到普通整行时再参与计算。加运算结束后。结果将会被截断,然后再执行加法运算。
 如何进行整型提升呢?
 整型提升按照变量的数据类型的符号位来提升的。  高位补充符号位  无符号整型提升高位补零。

int main()
{
	char a = 3;
	//00000000000000000000000000000011
	//00000011--截断
	char b = 1237;
	//00000000000000000000000001111111
	//01111111--截断
	char c = a + b;
	//00000000000000000000000100000010
	//10000010--c 只取八位
	//整型提升
	printf("%d", c);
	//11111111111111111111111110000010
	//11111111111111111111111110000001
	//10000000000000000000000001111110
	//-126
	return 0;

}

一般会发生的整型提升的例子:

int main()
{
	//char 的范围-128~127
 //unsigned char
	char a = 0xb6;
	short b = 0xb600;
	int c = 0xb6000000;

	if (a == 0xb6)
		printf("a");
	if (b == 0xb600)
		printf("b");
	if (c == 0xb6000000)
		printf("c");
    //只有c打印,a与b都需要整形提升,提升之后值改变
	return 0;
}

整型提升,值发生了变化。

int main()
{
	char c = 1;
	char d = 2;

	printf("%u\n", sizeof(c));//1
	printf("%u\n", sizeof(+c));//4
	printf("%u\n", sizeof(-c));//4
	printf("%u\n", sizeof(c+d));//4
  //整形提升
	return 0;
}

我们可以根据数据类型来判断整型提升是存在的。

算术转换

如果某个操作数属于不同的类型,那麽除非其中一个操作数转为另一个操作数的类型,否则操作无法进行。寻常算术转换的层次体系:

long double
double
float;
unsigned long int
long int
unsigned int
int

如果一个数的类型在上面的列表很低,则它需要转化到另一个操作数的类型。
但是算数转化要合理。

float f = 3.14;
int num = f;//精度丢失

操作符的属性

复杂表达式求值有三个影响因素:

1.操作符的优先级
2.操作符的结核性
3.是否控制求值顺序

表达式的求值部分由操作符的优先级决定
操作符的优先级只能决定自减--的运算在+的运算的前面,但是我们没有办法的值,+操作符的左操作数的获取在右操作符之前还使之后求值,所以结果是不可预测的。

int fun()
{
	static int count = 1;
	return ++count;
}
int main()
{
	int answer;
	answer = fun() - fun() * fun();
	printf("%d\n", answer);//输出多少?
	return 0;
}

比如在这个函数调用,你如何去判断到底哪一个先去调用,这是不可预测的,值就不得而知。

你可能感兴趣的:(数据结构)