Skip to content

Number Literal Syntax by Language

A cross-language matrix for writing and parsing binary, octal, decimal, and hexadecimal integers - plus the precision traps each language hides.

FeatureJavaScript / TypeScriptPythonGoRustC / C++JavaShell (bash)
Binary literal0b111111110b111111110b111111110b1111_11110b11111111 (C23; else strtol base 2)0b11111111— (use $((2#11111111)))
Octal literal0o7550o7550o755 (or 0755)0o7550755 (leading zero!)— (removed; use 493)— (use $((8#755)))
Hex literal0xFF0xFF0xFF0xFF0xFF0xFF— (use $((16#FF)))
Arbitrary precision integer123n (BigInt literal)native (all ints)math/big.Intnum-bigint crateexternal (GMP)java.math.BigIntegerbc / python -c
Digit separator1_000_0001_000_0001_000_0001_000_0001'000'000 (C++14)1_000_000
Parse string in base NparseInt("ff", 16) / BigInt("0xff")int("ff", 16)strconv.ParseInt("ff", 16, 64)i64::from_str_radix("ff", 16)strtol("ff", NULL, 16)Integer.parseInt("ff", 16)$((16#ff)) or bc
Format value in base N(255).toString(16)hex(255) / f"{255:x}"strconv.FormatInt(255, 16)format!("{:x}", 255)printf("%x", 255)Integer.toHexString(255)printf "%x\n" 255 / bc

Traps worth memorizing

The leading-zero octal trap

In C, shell arithmetic, and pre-ES5 JavaScript, a bare leading zero means octal: 0755 is 493, and 089 is invalid or silently decimal depending on the parser. Modern languages moved to the explicit 0o prefix. Never pad decimal literals with zeros.

Java's missing octal

Java dropped octal literals entirely - there is no 0o support. Use Integer.parseInt("755", 8) or just write the decimal value.

parseInt without a radix

JavaScript's parseInt("08") historically parsed as octal in some engines. Always pass the radix: parseInt("08", 10). BigInt("0o17")-style strings are prefix-safe by construction.

The 2^53 wall

JavaScript numbers are IEEE-754 doubles: integers above 9007199254740991 (2^53 - 1) round silently. Use BigInt (123n or BigInt("...")) for anything larger - IDs, hashes, byte counters.

bash base#digits

bash arithmetic accepts base#digits for bases 2-64: $((16#FF)) is 255. Digits above 9 use lowercase letters, then uppercase, then @ and _ for the highest bases.

Convert between these bases

The universal base converter handles any base 2-36 with arbitrary precision, the octal to decimal converter goes deeper on octal, and the test vectors page gives you verified values to check your own parser against.