为什么<< 256 :: size(16)>>存在为<<< 1,0>>?

时间:2017-08-09 07:33:08

标签: erlang elixir

我正在阅读二元运算符的elixir doc:https://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html#binaries-and-bitstrings

在doc:

iex> <<255>>
<<255>>
iex> <<256>> # truncated
<<0>>
iex> <<256 :: size(16)>> # use 16 bits (2 bytes) to store the number
<<1, 0>>

默认为8位elixir二进制,如果超过8位,结果将截断为0。

但为什么<<256 :: size(16)>>会出现<<1, 0>>?我认为它应该是<<1, 255>>

1 个答案:

答案 0 :(得分:8)

<<1, 0>>是正确的。二进制256是0b100000000

iex(1)> 0b100000000
256

当你将它扩展到16位时,你得到0b0000000100000000

iex(2)> 0b0000000100000000
256

当您以big-endian字节顺序将其拆分为两个字节时,您会得到0b000000010b00000000,即10

iex(3)> <<256::size(16)>>
<<1, 0>>

在little-endian字节顺序中,当字节顺序颠倒时,你将获得01

iex(4)> <<256::little-size(16)>>
<<0, 1>>

要从big-endian字节返回原始数字,你可以想到它将最后一个数字乘以1,将第二个数字乘以256,将第三个数字乘以256 * 256,依此类推,然后将所有数字相加它们。

iex(5)> <<256::size(16)>>
<<1, 0>>
iex(6)> 1 * 256 + 0 * 1
256
iex(7)> <<123456::size(24)>>
<<1, 226, 64>>
iex(8)> 1 * 256 * 256 + 226 * 256 + 64 * 1
123456