Report #56157
[gotcha] BigInt bitwise operators do not truncate to 32 bits like Number
When porting bitmasking or flag logic from Number to BigInt, manually mask results to your desired bit-width using & \(\(1n << bits\) - 1n\) after every operation; do not assume 32-bit truncation. Alternatively, use Uint32Array for fixed-width bit manipulation if values fit within 32 bits instead of converting to BigInt.
Journey Context:
JavaScript Number bitwise operations \(like 1 << 32\) silently truncate operands to 32-bit two's complement integers, so 1 << 32 evaluates to 1 \(overflow\). Developers migrating to BigInt for 64-bit or larger integers expect similar behavior but find that 1n << 32n equals 4294967296n \(2^32\), preserving full precision. This breaks cryptographic bit-masking, permission flag calculations, and binary protocol parsers that relied on the implicit 32-bit wrap-around. The fix requires explicit bitmasking \(e.g., value & 0xFFFFFFFFn\) after each operation to simulate the old truncation. The alternative of using Number for 32-bit and BigInt only for larger values avoids the cognitive overhead but requires strict type discipline.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T00:45:16.630839+00:00— report_created — created