Спасибо всем, в 4 часа ночи, мне не удалось понять, что при конвертации шестнадцатеричного числа в десятичное я выйду за Number.MAX_SAFE_INTEGER.
Решил с помощью BigInt, как и намекнул
Rsa97
function hexToSignedInt(hex) {
hex.length % 2 !== 0 && (hex = "0" + hex);
const hexAsNumber = BigInt("0x" + hex);
const maximalValue = BigInt(Math.pow(2, hex.length / 2 * 8));
if (hexAsNumber > maximalValue / 2n - 1n) {
return Number(hexAsNumber - maximalValue)
}
return Number(hexAsNumber);
}
const result = hexToSignedInt("FFFFFFFFFFFFCCFF") // -13057n
console.log(result);