Rody66 писал(а):Так вот почему так происходит и где тут, собственно, логика?
5) Чтобы работать с байтами, а не со строками. Байтовый тип не хранит символы, он действительно числовой.
5. Одно число, другое - строка.
6) Что значит "самый большой"?
7) Это подтип типа Variant
32 бита никак не называются.
Одна из 32битных архитектур процессоров называется x86. Архитектуры x64 не существует, существует x86-64. Её, видимо для краткости, называют x64.
Неправильно говорить, что 32 бита = x18.
3. Для большинства фкнкций WinApi и функций, написанных на Си++, символ с кодом 0 является признаком конца строки. Аналогично, для юникода используется двухбайтный ноль.
6а. Подозреваю, что Long. Если очень постараться, то можно всё.
6б. Currency - это тип с фиксированной точкой, Double - с плавающей. Нелогично их сравнивать по диапазону.
Логика здесь в том, что компьютер, не умеющий представлять отрицательные числа, был бы малополезен. А поскольку компьютер располагает только битами, и ничем волшебным (что бы могло решить проблему), решили верхнюю половину положительных чисел отдать под отрицательные. Придумали такую систему, что арифметика для положительных и отрицательных чисел получилась одинаковая на уровне битов, а вся разница всплывает только при представлении числа в виде текста.
Перемещение формы по экрану можно отследить, сделав сабклассинг и обрабатывая сообщение WM_MOVE. За подробностями - в поиск по этим двум ключевым словам.
Rody66 писал(а):без каких либо дополнительных преобразований
Rody66 писал(а):Тот, который умещает самые большие числовые значения, и может спокойно производить манипуляции с ними.
Rody66 писал(а):Число размером всего в ~ 2 миллиарда? (4.2 при самом наилучшем раскладе). Дабл же вроде как в сотни раз больше.. Или я чего-то не знаю?
Rody66 писал(а):А по мне так, любые числовые значения логично сравнивать. Но судя по всему, дабл все-таки будет побольше.
Rody66 писал(а):А это Вы, собственно, как выяснили?
Rody66 писал(а):Ну, то, что 32 бита = x18 никто и не говорил.
Rody66 писал(а):А по делу, я так и не понял, что же все-таки считается правильным? 32 бита, 64 бита - верно; х86, х64 - неверно. если смотреть с чисто технически-педантичной стороны, так?
Rody66 писал(а):нулевого бита
Rody66 писал(а):Таким образом, "размер" переменной Integer равен FFFF, в то время как ее максимальное значение равно 7FFF, а чему же тогда равно минимальное значение в хексе?
Rody66 писал(а):Я уж думал и не вспомните.
Rody66 писал(а):И тем не менее, если в байтовый массив загнать текст, и вызвать мессагу с содержанием этого байта, то будет выведет именно текст, без каких либо дополнительных преобразований.
Rody66 писал(а):Тот, который умещает самые большие числовые значения, и может спокойно производить манипуляции с ними.
Rody66 писал(а):А это Вы, собственно, как выяснили?
Rody66 писал(а):Уж очень хочется лицезреть пример такого использования нулевого бита
Rody66 писал(а):Число размером всего в ~ 2 миллиарда? (4.2 при самом наилучшем раскладе). Дабл же вроде как в сотни раз больше.. Или я чего-то не знаю?
Rody66 писал(а):Уж очень хочется лицезреть пример такого использования нулевого бита
Private Sub Form_Load()
Dim Str As String
Str = "QQQ" & ChrW$(0) & "WWW"
MsgBox Str, , Len(Str)
End Sub
Rody66 писал(а):Число размером всего в ~ 2 миллиарда? (4.2 при самом наилучшем раскладе). Дабл же вроде как в сотни раз больше.. Или я чего-то не знаю?
Rody66 писал(а):Таким образом, "размер" переменной Integer равен FFFF, в то время как ее максимальное значение равно 7FFF, а чему же тогда равно минимальное значение в хексе?
Qwertiy писал(а):А так, без проблем, даже без WinApi и C++
Qwertiy писал(а):При этом есть два варианта вычислений: беззнаковый (диапазон 0 to 2^n-1) и знаковый (диапазон -2^(n-1) to 2^(n-1)-1)
Если рассматривать это на низком уровне, так как считает процессор то разницы нет. Разница проявляется на языках высокого уровня, но разница не в вычислениях конечно, а в диапазонах. Если например для без знакового целого типа операция 32 767 + 1 вполне корректная, то для знакового это вызовет переполнение. Другой пример, скажем счетчик, значение которого увеличивается в подпрограмме в машинных кодах, а на VB идет его считывание и отображение. В этом случае процессор без проблем сложит 32 767 + 1, но на VB последовательность будет 32 767, а за нем -32 768, что будет выглядеть несуразно. Поэтому, судя по контексту Qwertiy это и имел ввиду.Хакер писал(а):Вообще то нет никаких двух вариантов вычислений, знаковых и беззнаковых. Это заблуждение. Вычисления происходят единым во всех случаях образом.
ger_kar писал(а):Разница проявляется на языках высокого уровня, но разница не в вычислениях конечно, а в диапазонах.
Хакер писал(а):Вообще то нет никаких двух вариантов вычислений, знаковых и беззнаковых.
Хакер писал(а):Это не без WinAPI. Это косяк MessageBoxA, что он не всю строку отобразил, а остановился на первом ZC.
При помощи Double можно представить число вплоть до 1,79 * 10^308. Вот только точность будет небольшой, хотя манипуляции с такими числами это производить не мешает.
Ну что байта (или двух для юникода) уже поправили...
Это косяк MessageBoxA, что он не всю строку отобразил, а остановился на первом ZC.
Rody66 писал(а):Так вот, если перевести -32768 в хекс, а потом обратно из него, то результат будет 32768
Rody66 писал(а):Можно? Много чего можно.. А вот как на практике выполнить?
Rody66 писал(а):Я хотел увидеть пример реального использования нулего байта, когда без него просто не обойтись.
Rody66 писал(а):А можно подробнее, почему нулевой байт = ZC
Rody66 писал(а):Хоть стало ясно почему бинарники содержат так много нулевых байтов.
Qwertiy писал(а):Во-первых, почему A, а не W?
Qwertiy писал(а):В-третьих, это не косяк MessageBox'а, т. к. он получает на вход null-terminated string.
Rody66 писал(а):Сейчас немножко потестил на бейсике перевод из одной системы счисления в другую, и вывод результатов в текст, так вот
Rody66 писал(а):Я хотел увидеть пример реального использования нулего байта, когда без него просто не обойтись. Надеюсь в этот раз ясно выразился..
Rody66 писал(а):А можно подробнее, почему нулевой байт = ZC ?
Rody66 писал(а):Хоть стало ясно почему бинарники содержат так много нулевых байтов.
Такой результат невозможно получить ни при одном варианте преобразований. Как ты это получил? Покажи код.
Dim x As Integer, s As Integer
x = -32768
s = Hex(x)
Text1 = s '8000
Text2 = CLng("&H" & s) '32768
Уверяю тебя: не было перевода из одной системы счисления в другую.
В смысле? Так и выполнить.
Пример чего? Открой любой бинарный файл в хекс-редакторе, и увидишь кучу нулевых байтов.
Ну передай MessageBoxA какой-нибудь текст без нулевого символа в конце. В лучшем случае она покажет ещё огромный кусок бреда после сообщения, а в худшем — всё просто рухнет, потому что она дойдёт до памяти, чтение которой запрещено.
Не стало. Вернее, наверняка стало, но эта причинно-следственна связь, построенная тобою в твоей же голове — полностью ошибочна.
Заранее извиняюсь за свою безграмотность, но из той статьи я так и не понял, в какой из большого множества UTF кодируются exe.
Rody66 писал(а):Если речь о
- Код: Выделить всё
Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
то я данную функцию отлично использую и без вставки zc в конец текста. Может я опять чего то не понял?
Rody66 писал(а):Можно тогда вопрос: в какую кодировку компилируются екзешники?
Rody66 писал(а):Прошу:
- Код: Выделить всё
Dim x As Integer, s As Integerx = -32768s = Hex(x)Text1 = s '8000Text2 = CLng("&H" & s) '32768
Rody66 писал(а):Это, видимо, надо понимать так, что не было верного перевода из одной системы счисления в другую?
Rody66 писал(а):Вероятнее всего.. Можно тогда вопрос: в какую кодировку компилируются екзешники? Заранее извиняюсь за свою безграмотность, но из той статьи я так и не понял, в какой из большого множества UTF кодируются exe.
Rody66 писал(а):То, что в бинарнике преобладают нулевые байты мне итак прекрасно известно
Rody66 писал(а):Это, видимо, надо понимать так, что не было верного перевода из одной системы счисления в другую?
Rody66 писал(а):Хорошо. Таким образом, какое максимальное значение может принимать Double переменная?
1.79769313486231E+308. То есть 1797693134862310000 и ещё 290 нулей. Это достаточно много, по-моему.
EXE-файл это даже близко не файл с текстом. С чего ради UTF должны иметь к EXE-файлу какие-то отношения? К EXE-файлу не применим термин «кодировка», а применим термин «формат». Формат EXE-файла — PE-формат.
Rody66 писал(а):1 байт - 256, 2 байта - 256^2 ~ 65 000, 4 байта 256^4 ~ 4 000 000 000, 8 байт - 256^8 = (9223772036854775807 * 2) ~ 18440000000000000000 (всего 19 знаков после запятой, далеко не 308, как у Вас.)Калькулятор считает максимум 8 байт и переменные там со знаком, поэтому следующее после 9223772036854775807 число - это -1. И поэтому максимальное значение переменной совсем приблизительное. Откуда же тогда Вы взяли такое большое число?
Rody66 писал(а):Откуда же тогда Вы взяли такое большое число?
Сейчас этот форум просматривают: AhrefsBot и гости: 33