Skip to content

Commit 9cf8b0b

Browse files
committed
Add and test integer binary literals
1 parent dce597f commit 9cf8b0b

File tree

3 files changed

+66
-1
lines changed

3 files changed

+66
-1
lines changed

compiler/src/dotty/tools/dotc/parsing/Scanners.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,7 @@ object Scanners {
884884
nextChar()
885885
ch match {
886886
case 'x' | 'X' => base = 16 ; nextChar()
887-
//case 'b' | 'B' => base = 2 ; nextChar()
887+
case 'b' | 'B' => base = 2 ; nextChar()
888888
case _ => base = 10 ; putChar('0')
889889
}
890890
if (base != 10 && !isNumberSeparator(ch) && digit2int(ch, base) < 0)

tests/neg/binaryLiterals.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
object Test:
3+
val x = 0b1__0000_0000_0000_0000__0000_0000_0000_0000 // error: number too large
4+
val y = 0b1__0000_0000_0000_0000__0000_0000_0000_0000__0000_0000_0000_0000__0000_0000_0000_0000L // error: number too large

tests/run/binaryLiterals.scala

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
@main
2+
def Test =
3+
assert(0b0000 == 0)
4+
assert(0b0001 == 1)
5+
assert(0b0010 == 2)
6+
assert(0b0100 == 4)
7+
assert(0b1000 == 8)
8+
9+
assert(0b0001_0000 == 16)
10+
assert(0b0010_0000 == 32)
11+
assert(0b0100_0000 == 64)
12+
assert(0b1000_0000 == 128)
13+
14+
assert(0b0001_0000_0000 == 256)
15+
assert(0b0010_0000_0000 == 512)
16+
assert(0b0100_0000_0000 == 1024)
17+
assert(0b1000_0000_0000 == 2048)
18+
19+
assert(0b0001_0000_0000_0000 == 4096)
20+
assert(0b0010_0000_0000_0000 == 8192)
21+
assert(0b0100_0000_0000_0000 == 16384)
22+
assert(0b1000_0000_0000_0000 == 32768)
23+
24+
assert(0b0001__0000_0000_0000_0000 == 65536)
25+
assert(0b0010__0000_0000_0000_0000 == 131072)
26+
assert(0b0100__0000_0000_0000_0000 == 262144)
27+
assert(0b1000__0000_0000_0000_0000 == 524288)
28+
29+
assert(0b0001_0000__0000_0000_0000_0000 == 1048576)
30+
assert(0b0010_0000__0000_0000_0000_0000 == 2097152)
31+
assert(0b0100_0000__0000_0000_0000_0000 == 4194304)
32+
assert(0b1000_0000__0000_0000_0000_0000 == 8388608)
33+
34+
assert(0b0001_0000_0000__0000_0000_0000_0000 == 16777216)
35+
assert(0b0010_0000_0000__0000_0000_0000_0000 == 33554432)
36+
assert(0b0100_0000_0000__0000_0000_0000_0000 == 67108864)
37+
assert(0b1000_0000_0000__0000_0000_0000_0000 == 134217728)
38+
39+
assert(0b0001_0000_0000_0000__0000_0000_0000_0000 == 268435456)
40+
assert(0b0010_0000_0000_0000__0000_0000_0000_0000 == 536870912)
41+
assert(0b0100_0000_0000_0000__0000_0000_0000_0000 == 1073741824)
42+
assert(0b1000_0000_0000_0000__0000_0000_0000_0000L == 2147483648L)
43+
44+
assert(0b1000_0000_0000_0000__0000_0000_0000_0000 == -2147483648) // Signed !
45+
assert(0b1111_1111_1111_1111__1111_1111_1111_1111 == -1)
46+
47+
// Randomly generated using https://numbergenerator.org/random-32-bit-binary-number#!numbers=10&length=32&addfilters=
48+
// Converted to sined decimal using https://onlinetoolz.net/unsigned-signed#base=2&bits=32
49+
assert(0b0110_1000_1100_0101_0010_1100_0100_0011 == 1757752387)
50+
assert(0b1111_0101_0100_1011_0101_1000_0011_0110 == -179611594)
51+
assert(0b0000_0011_0000_1010_1010_0011_0000_0000 == 51028736)
52+
assert(0b0101_0010_1111_1001_0100_0101_1101_1011 == 1392068059)
53+
assert(0b1001_0000_1111_1001_1011_1101_1100_1111 == -1862681137)
54+
assert(0b0000_0111_1110_1100_0111_1100_1000_0010 == 132938882)
55+
assert(0b0000_1011_0111_1011_0001_1010_1010_1000 == 192617128)
56+
assert(0b1100_1100_1000_1010_1111_0111_0100_1101 == -863307955)
57+
assert(0b1000_0000_0001_0010_0001_1001_0101_1110 == -2146297506)
58+
assert(0b1110_0000_0110_1100_0111_0110_1100_1111 == -529762609)
59+
60+
assert(0b0010_1001_0101_1001__1010_0100_1000_1010__1001_1000_0011_0111__1100_1011_0111_0101L == 2979593543648529269L)
61+
assert(0b1101_1110_0100_1000__0010_1101_1010_0010__0111_1000_1111_1001__1010_1001_0101_1000L == -2429641823128802984L)

0 commit comments

Comments
 (0)