整型默认长度8位及一个疑点
1 | Erlang/OTP 17 [erts-6.0] [source] [smp:2:2] [async-threads:10] [kernel-poll:false] |
说明了一个segment默认是8位,高于8位的部分被截断
同理1
2
3
4
5
61> A = <<15768105>>.
<<")">>
2> $).
41
3> io:format("~.16B", [15768105]).
F09A29ok
16进制29是10进制的41,由此可以看出<<15768105>>其实等于<<41>>41>15768105>
但是1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
161> <<41>> = <<15768105>>.
<<")">>
2> <<15768105>> = <<41>>.
** exception error: no match of right hand side value <<")">>
3> <<1:1>> = <<3:1>>.
<<1:1>>
4> <<3:1>> = <<1:1>>.
** exception error: no match of right hand side value <<1:1>>
5> <<5:2>> = <<13:2>>.
** exception error: no match of right hand side value <<1:2>>
6> A = <<15768105>>.
<<")">>
7> B = <<41>>.
<<")">>
8> A = B.
<<")">>
这些该如何解释呢?
基本形式
1 | Value:Size/TypeSpecifierList |
默认值
类型默认为integer
Size的默认项:
integer默认8位,float默认64位
binary或bitstring处于尾部时默认匹配全部
Unit的默认项:
integer和float和bitstring为1, binary为8
Signedness默认为unsigned
Endianness默认为big
词法注意
1 | B=<<1>>需要写成B = <<1>>, 否则编译器会理解为小于等于 |
Unit
最好不要改binary和bitstring的Unit
语法糖
1 | <<"hello">>是<<$h,$e,$l,$l,$o>>的语法糖 |
常用写法
取尾部的写法:1
2foo(<<A:8,Rest/binary>>) ->
foo(<<A:8,Rest/bitstring>>) ->
高效拼binary的写法:1
2
3
4
5
6
7triples_to_bin(T) ->
triples_to_bin(T, <<>>).
triples_to_bin([{X,Y,Z} | T], Acc) ->
triples_to_bin(T, <<Acc/binary,X:32,Y:32,Z:32>>); % inefficient before R12B
triples_to_bin([], Acc) ->
Acc.