What I'm looking for is a way to explain/understand simply how SmallInteger are implemented.
Two's complement is a platform representation of integers not (necessarily) a smalltalk one. The concept of negative numbers has nothing to do with the radix a number is expressed in.
Yes I learned that
There are convenient extensions to the ByteArray protocol added by FFI which allow easy conversion though. I don't have time this second to list them, but will do so in a few hours.
That's true, but the internal implementation leaks out the bitAnd: bitOr: and other bit operations...
I want to explain two's complement then Smalltalk smallinteger \section{Two's complement of a number} .... Creating a two complement version of a number equals negating the number bits and adding one. \begin{code}{Calculating two complement of 3} 3 bitString '0000000000000000000000000000011' 3 bitInvert bitString '1111111111111111111111111111100' (3 bitInvert + 1) bitString '1111111111111111111111111111101' -3 bitString '1111111111111111111111111111101' \end{code} .... \section{SmallIntegers in Smalltalk} Smalltalk small integers uses a two's complement arithmetic on 31 bits. An N-bit two's-complement numeral system can represent every integer in the range $-1 * 2^{N-1}\ to\ 2^{N-1}-1$. So for 32 bits Smalltalk systems, small integers values are the range -1073741824 to 1073741823. Let's check that a bit (this is the occasion to say it). \begin{code}{} 2 raisedTo: 29 returns 536870912 536870912 class returns SmallInteger 2 raisedTo: 30 returns 1073741824 1073741824 class returns LargePositiveInteger -1073741824 class returns SmallInteger 2 class maxVal returns 1073741823 -1 * (2 raisedTo: (31-1)) returns -1073741824 (2 raisedTo: 30) - 1 returns 1073741823