C语言开发笔记(一)自动转换和强制转换

        整型数据和实行数据之间可以进行运算,而且字符型数据可以和整型数据通用,所以整型、实型、字符型数据之间也是可以进行运算的,但在运算处理之前,不同类型的数据要事先转换成同一种数据类型。转换方法有两种:自动转换和强制转换。

(1)自动转换

原则:

1、若参与运算量的类型不同,则先转换成同一类型,然后进行运算;

2、转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int型转换成long型后再进行运算;

3、所有浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再进行运算;

4、char型和short型参与运算时,必须先转换成int型;

5、在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长于左边时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。

需要注意的是,char转为double的过程是一次性的,无需中间过程,其他转换同样。

如果运算中同时包含有符号signed和无符号unsigned的数据,会自动地隐式地将有符号转换为无符号,即signed->unsigned。

举例说明

#include <stdio.h>

int main(void)
{
    int a = -1;
    unsigned int b = 1;
    int c = 0;

    c = a > b ? a : b; 

    return 0;
}

正常逻辑是-1 < 1,所以c的值是1。

但实际运行后c的值是-1。

在编译的时候编译器兄弟也告诉我们:

解析:当运算a > b时,a先自动转换成unsgined,其值即为2^{32}-1,再与b比较是否比b的值大,结果为真,所以a的值赋值给c。

我们稍微修改代码,让c成为unsigned。

#include <stdio.h>

int main(void)
{
	int a = -1;
	unsigned int b = 1;
	unsigned int c = 0;

	c = a > b ? a : b; 

	return 0;
}

这时候看到结果为

C语言中有符号整型变量把数据的最高位作为符号位使用,因此能表示数的正负;

无符号整型变量把数据的最高位最为数据位使用,因此不能表示负数。

(2)强制转换

强制转换格式为:(数据类型)(表达式)。

需要注意(int)x+y是先把x转换成int型后再与y相加,而(int)(x+y)是把x和y相加的结果转换成int型。

无论是自动转换还是强制转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。

猜你喜欢

转载自blog.csdn.net/Dr_Haven/article/details/82587384