我是Erlang的新手,有人能解释一下这个代码片段中发生了什么吗?
<<2.03:64/float>>.
<<64,0,61,112,163,215,10,61>>
<<2.03:32/float>>.
<<64,1,235,133>>我正在阅读Joe Armstrong所著的Programming Erlang: Software for a Concurrent World,以及第二章的二进制和位语法。
如果答案已经存在,请将其标记为重复。谢谢。
发布于 2021-01-14 21:06:35
来自C语言的相同结果:
#include <stdio.h>
int main (int argc, char *argv[]) {
float f = 2.03F;
unsigned char *c;
c = (unsigned char *) &f;
for (int i = 0; i < 4; ++i)
printf("%d ", c[i]);
printf("\n");
double d = 2.03;
c = (unsigned char *) &d;
for (int i = 0; i < 8; ++i)
printf("%d ", c[i]);
printf("\n");
}输出:
133 235 1 64
61 10 215 163 112 61 0 64 或者Perl:
$ perl -wE 'say join " ", map ord, split //, pack "f", 2.03'
133 235 1 64
$ perl -wE 'say join " ", map ord, split //, pack "d", 2.03'
61 10 215 163 112 61 0 64这就是浮点数在内部的表示方式。参见Floating-point aritmetic。
这是一个试验values here的很好的演示。
发布于 2021-01-19 01:23:24
<<2.03/float>>.
<<64,0,61,112,163,215,10,61>>在erlang中,浮点二进制文件的默认大小为64,因此输出存储为8X8= 64字节。当浮点数的默认大小为32时,它将存储为4 X 8= 32字节。下面的代码展示了如何从一个字节中提取位。
[ K || <<K:1>> <= <<2.03/float>>].
[0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,0,1] 上述输出中的前8位是“0,1,0,0,0,0,0,0,0”,当转换为整数时,输出如下。
erlang:list_to_integer("01000000",2).
64类似地,接下来的8位给0,第三组8位给61,依此类推。
发布于 2021-01-15 23:18:37
<<64,0,61,112,163,215,10,61>>
<<64,1,235,133>>
这就是为什么你不能简单的得到:
<<163,215,10,61>>我是新来erlang的
那么浮点数的位语法就是您最不需要担心的了。如果你理解整数的含义,那就继续吧。
https://stackoverflow.com/questions/65719019
复制相似问题