奇思妙想 · 2024年 10月 25日 0

编程语言的类型转换

44 次浏览
  • 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')