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

Tan*_*onk 3 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>>
Run Code Online (Sandbox Code Playgroud)

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

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

Dog*_*ert 8

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

iex(1)> 0b100000000
256
Run Code Online (Sandbox Code Playgroud)

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

iex(2)> 0b0000000100000000
256
Run Code Online (Sandbox Code Playgroud)

当你以big-endian字节顺序将它分成两个字节时,你会得到0b000000010b00000000,这是10.

iex(3)> <<256::size(16)>>
<<1, 0>>
Run Code Online (Sandbox Code Playgroud)

在little-endian字节顺序中,你将得到0并且1随着字节的顺序颠倒:

iex(4)> <<256::little-size(16)>>
<<0, 1>>
Run Code Online (Sandbox Code Playgroud)

要从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
Run Code Online (Sandbox Code Playgroud)