[erlang-questions] surprising integer (external) encoding

Valentin Micic <>
Thu Jul 5 21:30:47 CEST 2007


> 4 bits for the type tag.
> 1 bit for sign.

You're talking about *internal* term presentation, right? Because this 
explanation does not hold water for external format, where things are quite 
different. For example:

(A)    term_to_binary( 2 ) produces: <<131, 97, 2>>

where:
    - 131 is a *magic* number
    - 97 represents external tag for one-byte integer
    - 2 represents the integer value, encoded in a single byte.

According to your explanation one would not be able to encode single integer 
values higer that 2^3, and yet,

(B)    term_to_binary( 255 ) produces: <<131, 97, 255>>


To make things even more confusing, the second complement encoding is using 
always 32, i.e.

(C)   term_to_binary( -2 ) produces: <<131,98,255,255,255,254>>

    - 131 is a *magic* number
    - 98 represents external tag for four-byte integer (actually, 2^27)
    -  <<255,255,255,254>> -- second complement encoding for -2.

How does "4 bits for tag and 1 bit for sign" fit this observation?

V.

PS
Thanks for the reply.




More information about the erlang-questions mailing list