[.NET] Реализация CLI, add(int32, native)
А вообще, по ощущениям расширять знаково. Очевидно, что если мы хотим к указателю long 123456 прибавить int -56 то хотим получить long 123400 независимо от того, 32 или 64-битная машина у нас.
Сообщение удалил
вроде знаковое расширение получилось.
char[] name = new char[] { 'J', 'a', 'c', 'k', 'i', 'e', ' ', 'C', 'h', 'a', 'n' };
fixed (char* letter = &name[10])
{
Console.WriteLine(*(letter-5;
}
превратилось это в такой IL:
.locals init (
[0] char[] chArray1,
[1] char& pinned chRef1)
L_0000: ldc.i4.s 11
L_0002: newarr char
L_0007: dup
L_0008: ldtoken <PrivateImplementationDetails>{CC4AA509-3A36-4C61-9BA4-C709EB552F57}/__StaticArrayInitTypeSize=22 <PrivateImplementationDetails>{CC4AA509-3A36-4C61-9BA4-C709EB552F57}::$$method0x6000001-1
L_000d: call void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray([mscorlib]System.Array, [mscorlib]System.RuntimeFieldHandle)
L_0012: stloc.0
L_0013: ldloc.0
L_0014: ldc.i4.s 10
L_0016: ldelema char
L_001b: stloc.1
L_001c: ldloc.1
L_001d: conv.i
L_001e: ldc.i4.s 10
L_0020: conv.i
L_0021: sub
L_0022: ldind.u2
L_0023: call void [mscorlib]System.Console::WriteLine(char)
L_0028: ldc.i4.0
L_0029: conv.u
L_002a: stloc.1
L_002b: ret
Т.е. реально знаковое.
я тестировал на следующем коде:
.method private hidebysig static int64 test cil managed
{
.maxstack 8
ldc.i4.0
conv.u
ldc.i4 4294967295
add
conv.i8
ret
}
здесь в стек записываются:
0 типа native int
-1 типа int32
затем над ними производится операция сложения и её результат преобразуется к int64
на 64-битной машине функция возвращает -1 => расширение при сложении было знаковым
Оставить комментарий
agaaaa
Читаю спецификацию и не могу понять, как должно выполняться сложение int32 и native'а.Очевидно, в общем случае надо преобразовать аргумент int32 к типу native. Положим native 64-битный. Но тогда как расширять int32 - знаково или беззнаково?