首先,请注意任意大小的整数以及有符号和无符号整数之间的区别都是添加到 LLVM 2.0 的修改。早期版本只有几个整数类型,有符号/无符号的区别。
现在,针对您的问题:
LLVM 尽管设计时考虑了 C/C++,但并不特定于这些语言。拥有更多可能的整数类型可为您提供更大的灵活性。当然,您不必使用这些类型 - 我猜,正如您所提到的,任何 LLVM 的 C/C++ 前端(即 Clang)可能只会生成 i1、i8、i16、i32 和 i64 .
编辑:显然我弄错了,Clang 也使用了其他一些整数类型,请参阅下面 Jens 的评论。
是的,LLVM 不区分有符号和无符号整数类型,因此两者都将降低到 i32。但是,对无符号整数的操作将根据原始类型进行转换;例如,无符号整数之间的除法将是udiv
,而有符号整数之间的除法将是sdiv
。但是,因为整数表示为二进制补码,所以许多操作(例如add
)不关心有符号/无符号,因此只有一个版本。
至于为什么在 LLVM 中没有区分有符号和无符号,请阅读此增强请求的详细信息- 简而言之,有符号和无符号版本会导致 IR 膨胀并且不利于某些优化,所以它被删除了。
最后,你问为什么不f32
——答案是我不知道,也许它被认为不如任意大小的整数有用。但是,请注意这f32
并不是真正的描述性 - 如果您想要任意浮点类型,您至少需要指定基数的大小和指数的大小,例如f23e8
代替float
和f52e11
代替double
。如果您问我,这有点麻烦,尽管我猜想float
并且double
可能已成为这些的同义词。