Ответ 1
Прежде всего, обратите внимание на целые числа произвольного размера, и никакое различие между целыми числами без имени и без знака - это изменения, добавленные в LLVM 2.0. Более ранние версии имели только несколько целочисленных типов с обозначением/без знака.
Теперь, на ваши вопросы:
-
LLVM, хотя он разработан с учетом C/С++, не относится к этим языкам. Наличие более возможных целых типов дает вам большую гибкость. Конечно, вам не обязательно использовать эти типы - и я предполагаю, что, как вы уже упоминали, любой интерфейс C/С++ для LLVM (то есть Clang), вероятно, будет генерировать только i1, i8, i16, i32 и i64.
Редактирование: видимо, я ошибаюсь, и Клэнг также использует некоторые другие целочисленные типы, см. комментарий Йенса ниже.
-
Да, LLVM не делает различий между целым типом signed и unsigned, поэтому оба они будут опущены на i32. Однако операции с целым числом без знака будут переведены в соответствии с исходным типом; например разделение между целыми без знака будет
udiv
, а между подписанными будетsdiv
. Поскольку целые числа представлены как два дополнения, однако многие операции (например,add
) не заботятся о подписанных/неподписанных и поэтому имеют только одну версию.Что касается того, почему в LLVM между подписанным и неподписанным не было различий, прочитайте информацию об этом расширенном запросе - короче говоря, наличие как подписанных, так и неподписанных версий привело к большой ИК-раздув и был вреден для некоторых оптимизаций, поэтому он был удален.
Наконец, вы спрашиваете, почему нет
f32
- ответ заключается в том, что я не знаю, возможно, это было менее полезно, чем целые числа произвольного размера. Однако обратите внимание, чтоf32
на самом деле не описательно - если вам нужны произвольные типы с плавающей точкой, вам нужно как минимум указать размер базового номера и размер экспоненты, напримерf23e8
вместоfloat
иf52e11
вместоdouble
. Это немного громоздко, если вы спросите меня, хотя я думаю, чтоfloat
иdouble
могли быть сделаны синонимами.