Уважаемые Тютюнников и 3dcad! Очень приятно, что Вы мне дали столько информации. Только байт - это двузначное шестнадцатеричное целое и один символ может быть представлен в системе DOS двумя байтами. Насколько я понял это младший байт и старший байт, а вместе они образуют слово. Вернее пара байтов записанных в соседних ячейках памяти называется словом.
"При этом младший байт слова хранится по адресу, значение которого совпадает с адресом слова, а адрес старшего байта на 1 больше".
Книга "Освоим QBasic играючи", Эрни Каспер, Изд. "Радио и связь", стр. 127, 6 абзац свеху.
В языке QBasic есть специальные функции для чтения этих байтов (пример для чтения целых чисел типа INTEGER):
CLS 'Очистка экрана
A%=0 'Присвоение значения переменой
PRINT A% 'Вывод значения на экран
pag&=VARSEG(A%) 'Определение сегмента
adr&=VARPTR(A%) 'Определение смещения
DEFSEG=pag& 'Задание сегмента для чтения из ОЗУ
B0%=PEEK(adr&) 'Чтение младшего байта
B1%=PEEK(adr&+1) 'Чтение старшего байта
PRINT B0%, B1% 'Вывод значений байтов на экран
Для правильного чтения знака числа и вывода численного значения числа на экран последнюю строку надо заменить на следующие 6 строк:
IF B1%<128 THEN 'Проверка знака числа
C%=B0%+256*B1% 'Вычисление положительного значения
ELSE
C%=B0%+256*(B1%-256) 'Вычисление отрицательного значения
ENDIF
PRINT C% 'Вывод значения числа на экран
"Правильность понимания кодирования чисел типа INTEGER будет продемонстрирована совпадением значений, напечатанных в первой и второй строках", стр. 128.
На основании этих данных мне удалось написать 4 подпрограммы 3 из которых вроде не выдают ошибки. А вот 4 для типа DOUBLE не хочет никак работать. Изучите пожалуйста эти программы и помогите мне исправить ошибки в 4 подпрограмме чтобы она правильно работала:
Public Sub BaitInteger()
Dim b0 As Integer, b1 As Integer, Число As Integer, ЧислоОтвет As Variant
ПроверитьСледующееЧисло:
Open "bait" For Binary As 1#
Число = CInt(InputBox(0, "Веди число"))
Put 1#, , Число
Close 1#
Open "bait" For Binary As 1#
b0 = Asc(Input(1, 1#))
b1 = Asc(Input(1, 1#))
Close 1#
If b1 < 128 Then 'Проверка знака числа
ЧислоОтвет = b0 + 256 * b1 'Вычисление положительного значения
Else
ЧислоОтвет = b0 + 256 * (b1 - 256) 'Вычисление отрицательного значения
End If
MsgBox "Старший байт: " & CStr(b0) & vbLf & _
"Младший байт: " & CStr(b1) & vbLf & _
"Было введено число: " & ЧислоОтвет
GoTo ПроверитьСледующееЧисло
End Sub
Public Sub BaitLong()
Dim b0 As Long, b1 As Long, b2 As Long, b3 As Long, Число As Long, ЧислоОтвет As Long
ПроверитьСледующееЧисло:
Open "bait" For Binary As 1#
Число = CLng(InputBox(0, "Веди число"))
Put 1#, , Число
Close 1#
Open "bait" For Binary As 1#
b0 = Asc(Input(1, 1#))
b1 = Asc(Input(1, 1#))
b2 = Asc(Input(1, 1#))
b3 = Asc(Input(1, 1#))
Close 1#
MsgBox "Байт ?1 : " & CStr(b0) & vbLf & _
"Байт ?2: " & CStr(b1) & vbLf & _
"Байт ?3: " & CStr(b2) & vbLf & _
"Байт ?4: " & CStr(b3)
If b3 < 128 Then 'Проверка знака числа
ЧислоОтвет = b0 + 256 * (b1 + 256 * (b2 + 256 * b3)) 'Вычисление положительного значения
Else
ЧислоОтвет = b0 + 256 * (b1 + 256 * (b2 + 256 * (b3 - 256))) 'Вычисление отрицательного значения
End If
MsgBox "Было введено число: " & ЧислоОтвет
GoTo ПроверитьСледующееЧисло
End Sub
Public Sub BaitSingle()
Dim b0 As Single, b1 As Single, b2 As Single, b3 As Single, Число As Single, ЧислоОтвет As Single
Dim ЗнакЧисла As Integer, ПорядокЧисла As Integer, I As Integer
ПроверитьСледующееЧисло:
Open "bait" For Binary As 1#
Число = CSng(InputBox("Веди число", "SINGLE"))
Put 1#, , Число
Close 1#
Open "bait" For Binary As 1#
b0 = Asc(Input(1, 1#))
b1 = Asc(Input(1, 1#))
b2 = Asc(Input(1, 1#))
b3 = Asc(Input(1, 1#))
Close 1#
MsgBox "Байт ?1 : " & CStr(b0) & vbLf & _
"Байт ?2: " & CStr(b1) & vbLf & _
"Байт ?3: " & CStr(b2) & vbLf & _
"Байт ?4: " & CStr(b3)
'Определение знака числа
If b3 < 128 Then 'Проверка знака числа
ЗнакЧисла = 1
Else
ЗнакЧисла = -1
b3 = b3 - 128
End If
'Вычисление кода порядка
ПорядокЧисла = 2 * b3
'Коррекция кодов порядка и мантиссы
If b2 > 127 Then
ПорядокЧисла = ПорядокЧисла + 1
b2 = b2 - 128
End If
'Коррекция нормализованной мантиссы
If ПорядокЧисла > 0 Then
b2 = b2 + 128
End If
'Вычисление мантиссы
ЧислоОтвет = ((b0 / 256 + b1) / 256 + b2) / 256
MsgBox "Байт ?1 : " & CStr(b0) & vbLf & _
"Байт ?2: " & CStr(b1) & vbLf & _
"Байт ?3: " & CStr(b2) & vbLf & _
"Байт ?4: " & CStr(b3) & vbLf & _
"Знак числа: " & CStr(ЗнакЧисла) & vbLf & _
"Порядок числа: " & CStr(ПорядокЧисла)
'Вычисление модуля
If ПорядокЧисла > 126 Then
' при положительном порядке
For I = 1 To ПорядокЧисла - 126
ЧислоОтвет = ЧислоОтвет * 2
Next I
ElseIf ПорядокЧисла < 126 Then
' при отрицательном порядке
For I = 1 To 126 - ПорядокЧисла
ЧислоОтвет = ЧислоОтвет / 2
Next I
End If
'Коррекция знака числа
If ЗнакЧисла < 0 Then
ЧислоОтвет = -ЧислоОтвет
End If
MsgBox "Было введено число: " & ЧислоОтвет
GoTo ПроверитьСледующееЧисло
End Sub
Public Sub BaitDouble()
Dim b0 As Double, b1 As Double, b2 As Double, b3 As Double, b4 As Double, b5 As Double, b6 As Double, b7 As Double, Число As Double, ЧислоОтвет As Double
Dim ЗнакЧисла As Integer, ПорядокЧисла As Integer, I As Integer
ПроверитьСледующееЧисло:
Open "bait" For Binary As 1#
Число = CDbl(InputBox("Веди число", "Double"))
Put 1#, , Число
Close 1#
Open "bait" For Binary As 1#
b0 = Asc(Input(1, 1#))
b1 = Asc(Input(1, 1#))
b2 = Asc(Input(1, 1#))
b3 = Asc(Input(1, 1#))
b4 = Asc(Input(1, 1#))
b5 = Asc(Input(1, 1#))
b6 = Asc(Input(1, 1#))
b7 = Asc(Input(1, 1#))
Close 1#
MsgBox "Байт ?1 : " & CStr(b0) & vbLf & _
"Байт ?2: " & CStr(b1) & vbLf & _
"Байт ?3: " & CStr(b2) & vbLf & _
"Байт ?4: " & CStr(b3) & vbLf & _
"Байт ?5: " & CStr(b4) & vbLf & _
"Байт ?6: " & CStr(b5) & vbLf & _
"Байт ?7: " & CStr(b6) & vbLf & _
"Байт ?8: " & CStr(b7)
'Определение знака числа
If b7 < 128 Then 'Проверка знака числа
ЗнакЧисла = 1
Else
ЗнакЧисла = -1
b7 = b7 - 128
End If
'Вычисление кода порядка
ПорядокЧисла = 2 * b7
'Коррекция кодов порядка и мантиссы
If b6 > 127 Then
ПорядокЧисла = ПорядокЧисла + 1
b6 = b6 - 128
End If
'Коррекция нормализованной мантиссы
If ПорядокЧисла > 0 Then
b6 = b6 + 128
End If
'Вычисление мантиссы
ЧислоОтвет = ((((((b0 / 256 + b1) / 256 + b2) / 256 + b3) / 256 + b4) / 256 + b5) / 256 + b6) / 256
MsgBox "Байт ?1 : " & CStr(b0) & vbLf & _
"Байт ?2: " & CStr(b1) & vbLf & _
"Байт ?3: " & CStr(b2) & vbLf & _
"Байт ?4: " & CStr(b3) & vbLf & _
"Байт ?5: " & CStr(b4) & vbLf & _
"Байт ?6: " & CStr(b5) & vbLf & _
"Байт ?7: " & CStr(b6) & vbLf & _
"Байт ?8: " & CStr(b7) & vbLf & _
"Знак числа: " & CStr(ЗнакЧисла) & vbLf & _
"Порядок числа: " & CStr(ПорядокЧисла)
'Вычисление модуля
If ПорядокЧисла > 126 Then
' при положительном порядке
For I = 1 To ПорядокЧисла - 126
ЧислоОтвет = ЧислоОтвет * 2
Next I
ElseIf ПорядокЧисла < 126 Then
' при отрицательном порядке
For I = 1 To 126 - ПорядокЧисла
ЧислоОтвет = ЧислоОтвет / 2
Next I
End If
'Коррекция знака числа
If ЗнакЧисла < 0 Then
ЧислоОтвет = -ЧислоОтвет
End If
MsgBox "Было введено число: " & ЧислоОтвет
GoTo ПроверитьСледующееЧисло
End Sub
Мне кажется что для типа Double 2 последних байта отвечают за порядок числа но как они эти байты взаимоувязываются друг с другом мне не понятно. Если сделать 4 подпрограмму в следующем виде:
Public Sub BaitDouble()
Dim b0 As Double, b1 As Double, b2 As Double, b3 As Double, b4 As Double, b5 As Double, b6 As Double, b7 As Double, Число As Double, ЧислоОтвет As Double
Dim ЗнакЧисла As Integer, ПорядокЧисла As Integer, I As Integer
ПроверитьСледующееЧисло:
Open "bait" For Binary As 1#
Число = CDbl(InputBox("Веди число", "Double"))
Put 1#, , Число
Close 1#
Open "bait" For Binary As 1#
b0 = Asc(Input(1, 1#))
b1 = Asc(Input(1, 1#))
b2 = Asc(Input(1, 1#))
b3 = Asc(Input(1, 1#))
b4 = Asc(Input(1, 1#))
b5 = Asc(Input(1, 1#))
b6 = Asc(Input(1, 1#))
b7 = Asc(Input(1, 1#))
Close 1#
MsgBox "Байт ?1 : " & CStr(b0) & vbLf & _
"Байт ?2: " & CStr(b1) & vbLf & _
"Байт ?3: " & CStr(b2) & vbLf & _
"Байт ?4: " & CStr(b3) & vbLf & _
"Байт ?5: " & CStr(b4) & vbLf & _
"Байт ?6: " & CStr(b5) & vbLf & _
"Байт ?7: " & CStr(b6) & vbLf & _
"Байт ?8: " & CStr(b7)
'Определение знака числа
If b7 < 128 Then 'Проверка знака числа
ЗнакЧисла = 1
Else
ЗнакЧисла = -1
b7 = b7 - 128
End If
'Вычисление кода порядка
ПорядокЧисла = 2 * b7
'Коррекция кодов порядка и мантиссы
If b5 > 127 Then
ПорядокЧисла = ПорядокЧисла + 1
b5 = b5 - 128
End If
'Коррекция нормализованной мантиссы
If ПорядокЧисла > 0 Then
b5 = b5 + 128
End If
'Вычисление мантиссы
ЧислоОтвет = (((((b0 / 256 + b1) / 256 + b2) / 256 + b3) / 256 + b4) / 256 + b5) / 256
MsgBox "Байт ?1 : " & CStr(b0) & vbLf & _
"Байт ?2: " & CStr(b1) & vbLf & _
"Байт ?3: " & CStr(b2) & vbLf & _
"Байт ?4: " & CStr(b3) & vbLf & _
"Байт ?5: " & CStr(b4) & vbLf & _
"Байт ?6: " & CStr(b5) & vbLf & _
"Байт ?7: " & CStr(b6) & vbLf & _
"Байт ?8: " & CStr(b7) & vbLf & _
"Знак числа: " & CStr(ЗнакЧисла) & vbLf & _
"Порядок числа: " & CStr(ПорядокЧисла)
'Вычисление модуля
If ПорядокЧисла > 126 Then
' при положительном порядке
For I = 1 To ПорядокЧисла - 126
ЧислоОтвет = ЧислоОтвет * 2
Next I
ElseIf ПорядокЧисла < 126 Then
' при отрицательном порядке
For I = 1 To 126 - ПорядокЧисла
ЧислоОтвет = ЧислоОтвет / 2
Next I
End If
'Коррекция знака числа
If ЗнакЧисла < 0 Then
ЧислоОтвет = -ЧислоОтвет
End If
MsgBox "Было введено число: " & ЧислоОтвет
GoTo ПроверитьСледующееЧисло
End Sub
То для числа 0,5 программа работает правильно, а для чисел 0,6; 0,7 не правильно. Помогите пожалуйста разобраться в чём тут дело!