ejemplo: voy a usar 0xC0000000 (complemento con signo de 32 bits) para -2^30
const num = Number('0xC0000000') console.log(num === -Math.pow(2,30)) // expected: trueJavaScript solo tiene enteros en complemento a dos en dos lugares:
Como valor temporal durante algunas operaciones. Los operadores bit a bit usan enteros de 32 bits y algunos métodos de objetos Math funcionan con valores enteros de 32 bits (por ejemplo, imul ).
Como elemento en Int16Array , Int32Array o Int64Array . ( Int32Array en su caso).
De lo contrario, todos los números son number (coma flotante binaria de precisión doble IEEE-754) o BigInt (enteros de complemento a dos de precisión arbitraria).
Entonces, por ejemplo, puede tener un complemento de dos en un Int32Array de un solo elemento.
const array = Int32Array.from([0xC000000]); console.log(array[0].toString(16)); Sin embargo, cada vez que usa ese número entero de 32 bits, se convierte en number . Dicho esto, las conversiones de JavaScript entre el number y el inicio de sesión de 32 bits son bastante inteligentes. Por ejemplo, considere esta condición de contorno de complemento a dos:
const array = Int32Array.from([0x7FFFFFFF]); console.log(array[0].toString(16)); // 7fffffff ++array[0]; console.log(array[0].toString(16)); // -80000000 Eso es lo que querría para una operación de complemento a dos, aunque no es una operación de complemento a dos (en teoría, los motores de JavaScript pueden optimizar). La operación es complemento a dos de 32 bits int a number , incrementar number , convertir number de nuevo a complemento a dos de 32 bits int. Pero aun así obtenemos el resultado deseado.