I think this is by design - there's really little difference between the
signed and unsigned versions of the short data types, except how the
bits are interpreted. Assigning a value >127 to an int8 simply
overflows. See example [1] below. Arrays of type "unsigned int8[]" are
assignment-compatible with arrays of type "int8[]" (see example [2]
below), which supports this theory.

On a quick troll of the ECMA specs I couldn't find the exact spot that
asserts this, though there are numerous references to unsigned being
merely an alternate form of signed, and interpreted based on modifers
(unsigned) and special opcodes (e.g. *.ovf).

--Peter
http://www.razorsoft.net/weblog
http://staff.develop.com/peterd

[1]
assembly extern mscorlib {}
.assembly overflow {}
.method static void main() {
  .entrypoint
  .locals init (unsigned int8 b, int8 sb)
  ldc.i4 128
  stloc b
  ldloc b
  stloc sb
  ldloc sb
  box [mscorlib]System.SByte
  call void [mscorlib]System.Console::WriteLine(object)
  ldloc b
  box [mscorlib]System.Byte
  call void [mscorlib]System.Console::WriteLine(object)
  ret
}

[2]
.assembly extern mscorlib {}
.assembly overflow {}
.method static void main() {
  .entrypoint
  .locals init (unsigned int8[] rgb, int8[] rgsb)
  ldc.i4 1
  newarr unsigned int8
  dup
  stloc rgsb
  stloc rgb
  ret
}

> -----Original Message-----
> From: Discussion of the Rotor Shared Source CLI
> implementation [mailto:[EMAIL PROTECTED]] On
> Behalf Of Jeroen Frijters
> Sent: Saturday, August 17, 2002 11:43 AM
> To: [EMAIL PROTECTED]
> Subject: [DOTNET-ROTOR] sbyte[] == byte[]
>
>
> When I call a method expecting a byte[] with an sbyte[], the verifier
> doesn't mind. Is this by design or is it a bug?
>
> .assembly extern mscorlib {}
> .assembly test {}
> .module test.exe
> .imagebase 0x00400000
> .subsystem 0x00000003
> .file alignment 512
> .corflags 0x00000001
>
> .class private auto ansi beforefieldinit Test
>        extends [mscorlib]System.Object
> {
>   .method public hidebysig static void  Main() cil managed
>   {
>     .entrypoint
>     .maxstack  1
>     ldc.i4.1
>     newarr     [mscorlib]System.SByte
>     call       void Test::Func(unsigned int8[])
>     ret
>   }
>
>   .method public hidebysig static void  Func(unsigned int8[] b) cil
> managed
>   {
>     .maxstack  0
>     ret
>   }
>
>   .method public hidebysig specialname rtspecialname
>           instance void  .ctor() cil managed
>   {
>     .maxstack  1
>     ldarg.0
>     call       instance void [mscorlib]System.Object::.ctor()
>     ret
>   }
> }
>
> Regards,
> Jeroen
>

Reply via email to