how to initialize an array of typedef-ed type?

Jarrett Billingsley jarrett.billingsley at gmail.com
Fri May 1 08:13:37 PDT 2009


On Fri, May 1, 2009 at 10:07 AM, MLT <none at anone.com> wrote:

> At first I thought that maybe on my machine int and long have the same length, or some such. But it works, for int, long, and short. And they do have different lengths.

D's integer types are not like C's.  They are fixed size and do not
vary from platform to platform.  See
http://www.digitalmars.com/d/1.0/type.html

> I tried a bit more:
> ---
> typedef long tlong ;
>
> void main()
> {
>        int[] x = [1,2,3,4] ;
>
>        tlong[] y = cast(tlong[])[1,2] ; // <- this works
>
>        Stdout(y).newline ;
>
>        y = cast(tlong[]) x ; // This doesn't
>
>        Stdout(y).newline ;
> }
> ---
> prints out:
> [1, 2]
> [8589934593, 17179869187]
>
> The the initialization works, but casting from int[] to long[] in general doesn't.

You're actually doing two different things there.

Initialization is treated as a special case and casting it will cast
each element.

But array casts done at runtime will do a bit cast - that is, given
your int[] [1, 2, 3, 4], when you cast it to a long[] at runtime, it
takes that chunk of memory, figures out how many longs will fit in it
(in this case 2), and gives you a new array reference to the same data
but with a different type.  Those big weird numbers are
0x00000002_00000001 and 0x00000004_00000003, respectively.  Woah look
at that, 1, 2, 3, 4!

To make it more apparent, try casting an int[] to a byte[] or
something.  You'll see that it then splits up each original int into
four bytes.


More information about the Digitalmars-d-learn mailing list