[Lazarus] C Integer types

Hans-Peter Diettrich DrDiettrich1 at aol.com
Mon Jul 9 03:04:22 CEST 2012

Bernd K. schrieb:
> On 08.07.2012 17:18, Hans-Peter Diettrich wrote:
>> Bernd schrieb:
>>> 2012/7/7 Marco van de Voort <marcov at stack.nl>:
>> IMO all these members should be pointers, of size 64 bit according to 
>> the index increment (8 bytes?). Typecasts will be needed for 32 bit 
>> pointers, as demonstrated in above code.
> Wait a monment, I have again looked at it. I think I was right and my
> other email admitting that I was wrong was wrong.
> seqence_crc = *((int64_t*)data);
> seqence_key = *((int64_t*)&data[8]);
> from the inside out:
> data is a pointer, say it points to a buffer

It's a variable, which can be an array.

> (int64_t*)data still points to that buffer
> *((int64_t*)data) are bytes 0..7 of that buffer as int64.

No, as "int64_t*", what's a "^int64" in Pascal.

> now the second line
> seqence_key = *((int64_t*)&data[8]);
> data[8] is the same as *(data+8)
> data[8] represents the 8th byte of that buffer (already dereferenced!)

It represents the 8th *element*, which here (most probably) is a byte. 
It could be something else, depending on the declaration of "data".

> &data[8] is the address of that byte

This address is untyped in C - that's the trick and purpose of the 
entire construct. In OPL you can have both typed or untyped @ operators, 
depending on compiler options, but here a typecast into the real data 
type is required in either case.

> &data[8] would be the same as (data+8)
> ((int64_t*)&data[8]) is still the same pointer

It's a pointer *starting* at that address.

> *((int64_t*)&data[8]) are bytes 8..17 of that buffer as int64

The size of the pointer depends on the target memory model (16/32/64 
bit). There is room for an 64 bit pointer in bytes 8..15, but how many 
bytes really are used depends on the sizeof(pointer).

> this should be equivalent:
> seqence_crc = *((int64_t*)&data[0]);
> seqence_key = *((int64_t*)&data[8]);
> compr_crc   = *((int64_t*)&data[16]);
> compr_len   = *((int32_t*)&data[24]);
> and this also:
> seqence_crc = *((int64_t*)data);
> seqence_key = *((int64_t*)(data+8));
> compr_crc   = *((int64_t*)(data+16));
> compr_len   = *((int32_t*)(data+24));
> Its really just a simple record with 4 numbers in it.

With 4 pointers in it, aligned to 8 byte boundaries.


More information about the Lazarus mailing list