agnew@trwrc.UUCP (Robert A. Agnew) (04/25/89)
My comments about -32768 have prompted some rather strange replies.
Please accept my appologies for the hastily posted, poorly phrased,
and not well thought-out posting. Let me replace it with the following
summary of my thoughts and the replies which I received.
There appear to be only two logically consistent alternatives.
1) Complete the modulo 32768 paridgm by disallowing the value -32768.
This would require checking for the value 8000H after every operation
and considering it as an overflow condition.
2) Allow the value 8000H to represent -32768. This would require the
ability to discriminate between the two cases:
n := -32767 -1; (* legal -- no overflow *)
and
n := 32767 - 1; n := -n; (* illegal -- produces overflow *)
It appears at first glance that 2) is more trouble to implement than
it's worth. Unless someone can reccommend an efficient and iron-clad
algorithm for 2), I suggest we adopt 1). This was my original recomend-
ation. My original complaint was that the hardware allows -32768
rather than considering it as an overflow. I also was implying that
the original hardware scheme was inconsistent in that respect, but
when I built my first two's-compliment accumulator out of DTL in
1967, the inconsistency wasn't apparent to me either.Pat.Terry@p101.f19.n490.z2.fidonet.org (Pat Terry) (04/29/89)
There has been considerable discussion here recently about
I := -32768;
WriteInt(I,10)
This is handled "correctly" by JPI, QuickMod and FTL compilers.
FST objects to I := -32768.
I put the point to Roger Carvalho, the FST author, and his comment was
that -32768 might validly be regarded by a compiler as an expression rather
than as a literal. Now -32768 = -(32768), and 32768 is an invalid INTEGER
literal on the machines we are considering, so he has a point. This does
not seem to have been mentioned in the discussion yet.
--
uucp: {mcvax!uunet,tektronix,sun!nosun}!oresoft!dawggon!2!490!19.101!Pat.Terry
Internet: Pat.Terry@p101.f19.n490.z2.fidonet.orgbartonr@psu-cs.cs.pdx.edu (Robert Barton) (05/13/89)
Here is a summary of the results of WriteInt(-32768, 12): Compiler Version Output TDI Modula-2/Amiga 3.01 8000H -4294934528 TDI Modula-2/ST 2.30a M2S M2Sprint Amiga 1.00a 8000 -32768 ETH Modula-2 For Encore Multimax 2.00 Logitech Modula2/86 2.02 8000 -32768 Logitech Modula2/86 3.03 8000 -32768 M2Amiga 3.2 FFFF8000 -32768 Oregon Software Xenix/386 FFFF8000 -32768 Oregon Software Sun-3 FFFF8000 -32768 Sun Modula-2 2.1 FFFF8000 -32768 The TDI ST compiler wouldn't accept the assignment int := -32768, giving "this type is not expected". The person with the ETH compiler got a run-time range error. He also mentioned that on his system MinInt was defined as 080000000H rather than 08000H, so I can't figure that one out. The M2Amiga, Oregon Software, and Sun compilers apparently use 32-bit INTEGER and CARDINAL. I wonder how they handle WriteInt(-2147483648, 12) ? Thanks to everyone who responded.