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.
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. On Jul 4, 2011, at 15:14 , Stéphane Ducasse wrote: > Sven do your code work with Smalltalk smallInteger? > Because I think that in that case you should have 31 bits? > > >>> I would like to see the two complement representation of numbers. >> >> This is what I do, for reading/writing unsigned or two complement signed >> integer from/to byte streams. >> >> Note that two complement is only defined for a specific number size, 8, 16, >> 32 bits. >> >> unsignedToSigned: integer size: size >> ^ integer < (2 raisedTo: size - 1) >> ifTrue: [ integer ] >> ifFalse: [ (self twoComplement: integer size: size) negated ] >> >> >> signedToUnsigned: integer size: size >> ^ integer negative >> ifTrue: [ self twoComplement: integer size: size ] >> ifFalse: [ integer ] >> >> twoComplement: integer size: size >> | mask | >> mask := (2 raisedTo: size) - 1. >> ^ mask bitAnd: ((integer abs bitXor: mask) + 1) >> >> These are also very handy in this context (I believe I once submitted that >> as an issue): >> >> integerFromByteArray: bytes >> | integer | >> integer := 0. >> bytes withIndexDo: [ :each :index | >> integer := integer + (each bitShift: (bytes size - index) * 8) >> ]. >> ^ integer >> >> and Integer>>#asByteArrayOfSize: >> >> Once you have a byte representation, you can render it as bits as well. >> >> Sven >> >> >> > >
