Am 05.07.2011 00:26, schrieb Nicolas Cellier:
> 2011/7/5 Douglas McPherson <[email protected]>:
>> 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.
>>
>>
> That's true, but the internal implementation leaks out the bitAnd:
> bitOr: and other bit operations...
>
> Nicolas
>
>> 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
>>>>
>>>>
>>>>
>>>
>>
>>
Sorry for breaking into the thread.

A very good hint to get the picture of Integer representation in the
twos complement is the "Zahlenkreis". I always use the "Zahlenkreis" if
I have to explain someone the twos complement representation of fixed
point numbers.

See for instance
ti.uni-due.de/vs/de/education/Dv1/vorlesung2006/Folie-Zahlenkreis.pdf
for a transparency. (That given link is not a special choice for any
reason and I will not be paied for - you find many links with the search
topic "Zahlenkreis".)

I found a french translation: représentation circulaire. I think it is
called fixed-point circle in english:
http://www.mathworks.com/products/fixed/demos.html?file=/products/demos/shipping/fixedpoint/numbercircledemo.html

The Large Integers obviously are represented symmetric with a leading
sign bit.

(SmallInteger maxVal +1) printStringBase: 2  
'1000000000000000000000000000000'

It is astonisching that the smallest LargePositiveInteger has 30 0`s?

(SmallInteger maxVal +2) printStringBase: 2   
'1000000000000000000000000000001'
(SmallInteger maxVal +1) negated printStringBase: 2   
'-1000000000000000000000000000000'
(SmallInteger maxVal +2) negated printStringBase: 2   
'1000000000000000000000000000001'
(SmallInteger maxVal raisedTo: 10) printStringBase: 2  
'111111111111111111111111110110000000000000000000000000101100111111111111111111111110001000000000000000000000000011010001111111111111111111111100000100000000000000000000000011010001111111111111111111111110001000000000000000000000000000101100111111111111111111111111110110000000000000000000000000000001'
(SmallInteger maxVal raisedTo: 10) negated printStringBase: 2   
'-111111111111111111111111110110000000000000000000000000101100111111111111111111111110001000000000000000000000000011010001111111111111111111111100000100000000000000000000000011010001111111111111111111111110001000000000000000000000000000101100111111111111111111111111110110000000000000000000000000000001'

An interesting topic!

Regards

BB

Reply via email to