两种类型转换
低类型到高类型的隐式转换是安全的,不会产生截断,高类型到低类型的隐式转换时不安全的,可能得到不正确的结果
- 强制类型转换
-
强制类型转换
(Type)var_name;
(Type)value;
short s = 0x1122;
int i = (int)s; // 0x00001122
int j = (int)3.1415; // 3
强制类型转换的结果,目标类型能够容纳目标值,结果不变,目标类型不能容纳目标值,结果将产生截断。
隐式类型转换
编译器主动进行的类型转换,
—-算术运算中,低类型转换为高类型
—-赋值表达式中,表达式的值转换为左边变量的类型
—-函数调用时,实参转换为形参的类型
—-函数返回值,return表达式转换为返回值类型普通算数类型转换
许多运算符()会以相似的方式在运算过程中引起转换,并产生结果类型。效果是讲所有操作数转换为一个公共类型,并作为结果的类型,称为普通算数类型转换,变现为低类型往高类型转换。
函数类型转换
void f(int n)
表达式的类型转换
所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。代码里 0.0 就是 double,其它浮点数类型都需要额外加后缀(比如 0.0f)
char型和short型参与运算时,必须先转换成int型。
float是否变为double运算,char型和short型参与运算时,必须先转换成int型,是compiler决定的,不同平台不同结果。
C语言的boolean
判断时:
- 非零为真
- 零为假
表示时:
- 1为真
- 0为假 ```c m = (3>2)&&(k=5)
//m最后等于1 ``` C99新语言规范,新的变量类型_Bool,只能存1或者0,如果把其他值赋给变量就会被转换成1。在头文件 stdbool.h 中使用typedef将它变为bool关键字。
C语言的逻辑短路
原理上和JS一致,区别在于不会给左边赋值,&&左边为假,右边不会执行
float存在的意义
既然float要转换为double进行计算,那么float有什么意义呢?
- 不是所有编译都是转换为double的
- float占用内存是double的一半,内存读写快一倍
- 如果用上SIMD,float一次吞吐是double的两倍
在我们常用的电脑上的x86或者x64架构上,单个浮点数变量或者两个浮点数之间的运算是在一个双精度的浮点数栈上进行的,因此单精度浮点数在运算前会先被转换成双精度浮点数。
最后, 和一些初学者的直觉不同, “计算”本身并不是影响速度的最大原因. 假设需要的数据已经在寄存器中了, 那么由于现代CPU的微观并行化, 跑一条float指令和跑两条double的SSE指令几乎没有太大速度区别. 真正的问题在于内存吞吐量. float数据的读写显然的比double数据的读写省去了一半的数据量. 在CPU速度和内存速度不成比例的今天, 这个差距在数据量大时非常明显。