跳至内容
- C/ObjC/C++
- 对于大小在int范围内的整型(包括char/short和枚举)的类型使用时都自动转换成int.
- 汇编示例:char和int类型变量相加,char类型会使用movsx符号位扩展为int大小再参与计算。
- int和unsigned运算,int隐式转换成unsigned int.
- 假设都是4字节,对于汇编代码,并不会有特别的指令区分int和unsigned,只会通过形如eax或edx寄存器计算。
- int/unsigned int和long类型运算,前者自动转换成long类型。
- 假设int是4字节,long是8字节。汇编语言可能通过cdqe指令自动将32位有符号数转换成64位(保持符号位不变)。但需要注意,形如int_val = int_val + long_val, 编译器可能不会遵循前面的规则,因为最终结果保存在int类型,右边表达式不一定会将int_val扩展为64位。
- float类型和double类型运算,float会自动转换成double类型参与运算。
- 汇编语言会使用cvtss2sd将单精度转换成双精度浮点数指令完成float自动转换成double.
- 大小在long范围内和double类型运算,前者自动转换成double类型。
- 大小在long范围内和float类型运算,前者自动转换成float类型。
float类型变量任何时候都会转换成double类型吗?
- 这是错误的!在C语言中,如果long类型和float运算,long类型转换成float一起参与运算,而不是都转换成double类型。float_val = long_val + float_val; 对应汇编会是cvtsi2ss指令将long类型转换成float类型参与计算,而不是转换成double类型的cvtsi2sd指令.
强制类型转换
- C/ObjC/C++/C#/Java/PHP 等支持用 (new_type) 强制转换已有类型的变量。
- PHP 还支持settype函数转换为特定类型,这也提现PHP动态语言的特征。
检测数据类型
- C/ObjC/C++ 不支持获取基本变量的类型(C++ typeid除外)。
- PHP 提供is_*系列函数获取变量的类型,例如:is_string('abc')