From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,45a9122ddf5fcf5 X-Google-Attributes: gid103376,public From: bobduff@world.std.com (Robert A Duff) Subject: Re: Rules for Representation of Subtypes Date: 1996/09/23 Message-ID: #1/1 X-Deja-AN: 184845067 references: organization: The World Public Access UNIX, Brookline, MA newsgroups: comp.lang.ada Date: 1996-09-23T00:00:00+00:00 List-Id: In article , Matthew Heaney wrote: >I've always been curious about the rules for representation of subtypes. >For example, if I make a declaration like this: > > A_Small_Integer : Integer range 0 .. 255; -- assume type Integer is 4 bytes > >then is an implementation allowed to use fewer than 4 bytes to represent >A_Small_Integer? Yes. >Suppose I'm on a Unix system and I do this > > read (fd, A_Small_Integer'Address, 4); > >If the representation of A_Small_Integer is only 1 byte, then obviously I'm >in trouble. Am I required to specify the size of objects? Well, you could. But a better solution is to always say "aliased" when you have a variable you want to take 'Address of. Aliased variables will generally be represented the same way, for all variables of the type. Also, the number 4 is questionable. What are you trying to do? Read 4 bytes of data? Well in that case, you want to make sure the target variable is 4 bytes (which your code doesn't do). Or are you trying to read however-many-bytes it takes to fill up A_Small_Integer? In that case, you should be asking for that number of bytes, not 4 bytes. (You can calculate it based on 'Size, which, unfortunately, is in bits.) > A_Small_Integer : Integer range 0 .. 255; > for A_Small_Integer'Size use 32; -- required? That will make it the right size. But if you read 4 non-zero bytes, your program will be erroneous. - Bob