Что нового

Баг с Hex()

Sαuron

Новичок
Hex() возвращает некорректное число, если скормить ему целое, которое было получено в результате взаимодействия дробных чисел,
пример бага:
Код:
$byte_pos = 2
MsgBox('', '', Hex($byte_pos, 16)) ; 00 00 00 00 00 00 00 02
$byte_pos = 1.5 + 0.5
MsgBox('', '', Hex($byte_pos, 16)) ; 40 00 00 00 00 00 00 00
$byte_pos = 2.5 - 0.5
MsgBox('', '', Hex($byte_pos, 16)) ; 40 00 00 00 00 00 00 00
$byte_pos = 4 ^ 0.5
MsgBox('', '', Hex($byte_pos, 16)) ; 40 00 00 00 00 00 00 00
$byte_pos = 4 * 0.5
MsgBox('', '', Hex($byte_pos, 16)) ; 40 00 00 00 00 00 00 00
$byte_pos = 4 / 2
MsgBox('', '', Hex($byte_pos, 16)) ; 40 00 00 00 00 00 00 00
$byte_pos = 4 / 2 + 0
MsgBox('', '', Hex($byte_pos, 16)) ; 40 00 00 00 00 00 00 00

P.S. Этот баг выводил меня весь день, код работал с памятью и очень трудно было отладить его, даже не думал, что такая простая функция может работать неправильно :\
 

Dima1337

Осваивающий
Он плохо себя ведет только с дробными числами
Код:
$byte_pos = 2
MsgBox('', '', Hex($byte_pos, 16)) ; 00 00 00 00 00 00 00 02

$byte_pos = int(1.5 + 0.5)
MsgBox('', '', Hex($byte_pos, 16)) ; 00 00 00 00 00 00 00 02

$byte_pos = 2.0
MsgBox('', '', Hex($byte_pos, 16)) ; 40 00 00 00 00 00 00 00

А все потому что: Преобразует десятичное ЦЕЛОЕ число или бинарные данные в шестнадцатеричный вид.
 
Автор
S

Sαuron

Новичок
Это понятно, что если принудительно сделать его int, то проблемы не будет, но непонятно, почему нетипизированный ЯП с одним лишь типом Variant хранит числа 2.0 и 2 по разному, если они одного типа, при этом функции MsgBox(), ConsoleWrite() и даже String() выводят строго 2 и не поймешь, что там на самом деле float число 2.0, пока не заглянешь в память через CE
 

Dima1337

Осваивающий
Это не баг:
Код:
MsgBox('', '',VarGetType(2.1 + 1.9))

почему нетипизированный ЯП с одним лишь типом Variant хранит числа 2.0 и 2 по разному, если они одного типа
я рекомендую ознакомится со справкой: https://autoit-script.ru/autoit3_docs/intro/lang_datatypes.htm
 
Верх