74 lines
2.2 KiB
QBasic
74 lines
2.2 KiB
QBasic
|
'
|
||
|
' FLPT.BAS
|
||
|
'
|
||
|
' Displays how a given real value is stored in memory.
|
||
|
'
|
||
|
'
|
||
|
DEFINT A-Z
|
||
|
DECLARE FUNCTION MHex$ (X AS INTEGER)
|
||
|
DIM Bytes(3)
|
||
|
|
||
|
CLS
|
||
|
PRINT "Internal format of IEEE number (all values in hexadecimal)"
|
||
|
PRINT
|
||
|
DO
|
||
|
|
||
|
' Get the value and calculate the address of the variable.
|
||
|
INPUT "Enter a real number (or END to quit): ", A$
|
||
|
IF UCASE$(A$) = "END" THEN EXIT DO
|
||
|
RealValue! = VAL(A$)
|
||
|
' Convert the real value to a long without changing any of
|
||
|
' the bits.
|
||
|
AsLong& = CVL(MKS$(RealValue!))
|
||
|
' Make a string of hex digits, and add leading zeroes.
|
||
|
Strout$ = HEX$(AsLong&)
|
||
|
Strout$ = STRING$(8 - LEN(Strout$), "0") + Strout$
|
||
|
|
||
|
' Save the sign bit, and then eliminate it so it doesn't
|
||
|
' affect breaking out the bytes
|
||
|
SignBit& = AsLong& AND &H80000000
|
||
|
AsLong& = AsLong& AND &H7FFFFFFF
|
||
|
' Split the real value into four separate bytes
|
||
|
' --the AND removes unwanted bits; dividing by 256 shifts
|
||
|
' the value right 8 bit positions.
|
||
|
FOR I = 0 TO 3
|
||
|
Bytes(I) = AsLong& AND &HFF&
|
||
|
AsLong& = AsLong& \ 256&
|
||
|
NEXT I
|
||
|
' Display how the value appears in memory.
|
||
|
PRINT
|
||
|
PRINT "Bytes in Memory"
|
||
|
PRINT " High Low"
|
||
|
FOR I = 1 TO 7 STEP 2
|
||
|
PRINT " "; MID$(Strout$, I, 2);
|
||
|
NEXT I
|
||
|
PRINT : PRINT
|
||
|
|
||
|
' Set the value displayed for the sign bit.
|
||
|
Sign = ABS(SignBit& <> 0)
|
||
|
|
||
|
' The exponent is the right seven bits of byte 3 and the
|
||
|
' leftmost bit of byte 2. Multiplying by 2 shifts left and
|
||
|
' makes room for the additional bit from byte 2.
|
||
|
Exponent = Bytes(3) * 2 + Bytes(2) \ 128
|
||
|
|
||
|
' The first part of the mantissa is the right seven bits
|
||
|
' of byte 2. The OR operation makes sure the implied bit
|
||
|
' is displayed by setting the leftmost bit.
|
||
|
Mant1 = (Bytes(2) OR &H80)
|
||
|
PRINT " Bit 31 Bits 30-23 Implied Bit & Bits 22-0"
|
||
|
PRINT "Sign Bit Exponent Bits Mantissa Bits"
|
||
|
PRINT TAB(4); Sign; TAB(17); MHex$(Exponent);
|
||
|
PRINT TAB(33); MHex$(Mant1); MHex$(Bytes(1)); MHex$(Bytes(0))
|
||
|
PRINT
|
||
|
|
||
|
LOOP
|
||
|
|
||
|
' MHex$ makes sure we always get two hex digits.
|
||
|
FUNCTION MHex$ (X AS INTEGER) STATIC
|
||
|
D$ = HEX$(X)
|
||
|
IF LEN(D$) < 2 THEN D$ = "0" + D$
|
||
|
MHex$ = D$
|
||
|
END FUNCTION
|
||
|
|