Hi,
I need to specify 7-byte unsigned integer field in packed structure. To my surprise, this turned out to be not an easy thing to do across win32/win64 bit codebase.
Here's the test code
|program structtest;||
||
||TYPE Struct1Byte = bitpacked record||
|| Field : $00..$FF;||
|| end;||
||
|| Struct2Byte = bitpacked record||
|| Field : $00..$FFFF;||
|| end;||
||
|| Struct3Byte = bitpacked record||
|| Field : $00..$FFFFFF;||
|| end;||
||
|| Struct4Byte = bitpacked record||
|| Field : $00..$FFFFFFFF;||
|| end;||
||
|| Struct5Byte = bitpacked record||
|| Field : $00..$FFFFFFFFFF;||
|| end;||
||
|| Struct6Byte = bitpacked record||
|| Field : $00..$FFFFFFFFFFFF;||
|| end;||
||
|| Struct7Byte = bitpacked record||
|| Field : $00..$FFFFFFFFFFFFFF;||
|| end;||
||
||begin||
|| Writeln('SizeOf(Struct1Byte) = ',SizeOf(Struct1Byte));|| || Writeln('SizeOf(Struct2Byte) = ',SizeOf(Struct2Byte));|| || Writeln('SizeOf(Struct3Byte) = ',SizeOf(Struct3Byte));|| || Writeln('SizeOf(Struct4Byte) = ',SizeOf(Struct4Byte));|| || Writeln('SizeOf(Struct5Byte) = ',SizeOf(Struct5Byte));|| || Writeln('SizeOf(Struct6Byte) = ',SizeOf(Struct6Byte));|| || Writeln('SizeOf(Struct7Byte) = ',SizeOf(Struct7Byte));|| ||end.||
|
Here's what it produces when built for Win32
SizeOf(Struct1Byte) = 1
SizeOf(Struct2Byte) = 2
SizeOf(Struct3Byte) = 3
SizeOf(Struct4Byte) = 4
*SizeOf(Struct5Byte) = 8**
**SizeOf(Struct6Byte) = 8**
**SizeOf(Struct7Byte) = 8**
*
Here's what for Win64
SizeOf(Struct1Byte) = 1
SizeOf(Struct2Byte) = 2
SizeOf(Struct3Byte) = 3
SizeOf(Struct4Byte) = 4
*SizeOf(Struct5Byte) = 5**
**SizeOf(Struct6Byte) = 6**
**SizeOf(Struct7Byte) = 7**
*
Am I misusing bitpacked records somehow, or does this qualify as a bug?
// Gennadiy.