При добавлении int32
в 64-разрядный native int
, является ли знак CLR расширением или нулевым расширением 32-разрядного целого? И самое главное: на основе какой информации он делает этот выбор?
Я пишу компилятор .NET и прочитал спецификацию ECMA, но не смог найти ответ.
CLI поддерживает только подмножество этих типов в своих операциях над значениями, хранящимися в его стеке оценки:
int32
,int64
иnative int
.
- ECMA 335, Раздел я 12.1: Поддерживаемые типы данных
Так как значения в стеке оценки не имеют информации об их подписи, инструкции, для которых важна подпись операндов, имеют два варианта: один для подписанных и один для целых чисел без знака. Команды add
, sub
и mul
(те, которые не проверяют переполнение), не должны заботиться о подписности операндов, если операнды имеют одинаковый размер и, следовательно, имеют только единый вариант. Однако операнды не всегда одинакового размера...
ECMA 335, раздел III 1.5: таблица типов операндов утверждает, что int32
и native int
можно добавлять, вычитать, умножать и разделены. В результате снова будет native int
. В 64-битной системе a native int
имеет ширину 64 бит.
ldc.i4.0 // Load int32 0
conv.i // Convert to (64-bit) native int
ldc.i4.m1 // Load int32 -1
add // Add native int 0 and int32 0xFFFFFFFF together
Итак, каков будет результат здесь? Обратите внимание, что в соответствии со спецификацией время выполнения не требует отслеживания точных типов или подписи значений в стеке: он знает только int32
, int64
и native int
(и некоторые другие, которые не актуальны здесь).
Я бы предположил, что арифметика IntPtr
и UIntPtr
, так как она внутренне представлена как native ints, также будет использовать этот вид добавления. Однако ILSpy показывает, что добавление IntPtr
и int32
в С# вызывает перегруженный + оператор класса IntPtr
, который принимает только подписанный аргумент int32
.
Выполнение непосредственно в CIL (с помощью команды add
) также указывает, что целое число интерпретируется как подписанное. Он также должен был быть реализован в Mono, но я не мог найти ссылок на мои результаты.