【问题标题】:why is byte_size of huge number in erlang binary is 1?为什么erlang二进制中巨大数字的byte_size为1?
【发布时间】:2017-09-23 14:27:20
【问题描述】:

在erlang中,为什么用二进制表示的巨大数字的字节大小是1?我认为应该更多?

byte_size(<<9999999999994345345645252525254524352425252525245425422222222222222222524524352>>).
1

【问题讨论】:

    标签: binary erlang


    【解决方案1】:

    您没有指定整数大小,因此该值缩小到只有一个字节,正如您使用 Erlang shell 所看到的:

    1> <<9999999999994345345645252525254524352425252525245425422222222222222222524524352>>.
    <<"@">>
    

    如果你指定正确的大小,看起来是 263 位,你会得到正确的答案:

    2> byte_size(<<9999999999994345345645252525254524352425252525245425422222222222222222524524352:263>>).
    33
    

    【讨论】:

    • 很奇怪,所以如果我想要一个二进制文件,我必须事先知道它有多大。似乎 erlang 编译器可以自动执行某些操作。
    • 编译器无法做到这一点,因为编译时数字可能是未知的,如{ok, I} = io:read("Enter I followed by dot"), &lt;&lt;I&gt;&gt;.
    【解决方案2】:

    如果你想将任意整数转换成它的二进制表示,你应该使用binary:encode_unsigned

    7> byte_size(binary:encode_unsigned(9999999999994345345645252525254524352425252525245425422222222222222222524524352)).
    33
    
    encode_unsigned(Unsigned) -> binary()
    

    类型:

    Unsigned = integer() &gt;= 0encode_unsigned(Unsigned, big) 相同。

    encode_unsigned(Unsigned, Endianness) -> binary()
    

    类型:

    Unsigned = integer() &gt;= 0 Endianness = big | little 转换一个 正整数到二进制中可能的最小表示形式 数字表示,大端或小端。

    【讨论】:

      【解决方案3】:

      在 erlang 中,此数据类型是 binary。二进制是 8 位(字节)元素的序列。
      您只在此二进制文件中输入了一个值,因此结果值实际上是该值的模 256。如果你只在 shell 中输入二进制文件,你会得到:

      1> <<9999999999994345345645252525254524352425252525245425422222222222222222524524352>>.
      <<"@">>
      

      @ ASCII 值为 64。这意味着 this_long_num 模 256 = 64。

      正如您可能已经理解的那样,这意味着它仅代表 1 个字节 - 所以这就是此二进制文件的 byte_size/1 为 1 的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 2021-02-07
        • 2012-06-02
        • 2017-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多