gpt4 book ai didi

facebook - 为什么17位及以上的数字会自动变成偶数?

转载 作者:行者123 更新时间:2023-12-02 22:12:56 25 4
gpt4 key购买 nike

我正在测试 Facebook 的照片应用程序。我从 Facebook API 获取对象 ID,但收到了一些不正确的 ID,这没有意义 - 为什么 Facebook 会发送错误的 ID?我调查了一下,发现17位及以上的数字会自动变成偶数!

例如,假设我应该从 Facebook 收到的 ID 是 12345678912345679。在调试器中,我注意到 Flash Player 自动将其转换为 12345678912345678。我什至尝试手动将其设置回奇数,但它不断变回偶数。

有什么方法可以阻止 Flash Player 对数字进行四舍五入吗?顺便说一句,该变量被定义为 Object,我从 Facebook 收到它。

最佳答案

这与数据类型的实现有关:

  • int 是一个 32 位数字,正数和负数均匀分布负值,包括0。所以最大值是

    (2^32/2) - 1 == 2,147,483,647

  • uint 也是一个 32 位数字,但它没有负值。所以最大值为

    2^32 - 1 == 4,294,967,295

当您使用的数值大于 intuint 的最大值时,它会自动转换为 NumberFrom the Adobe Doc :

The Number data type is useful when you need to use floating-point values. Flash runtimes handle int and uint data types more efficiently than Number, but Number is useful in situations where the range of values required exceeds the valid range of the int and uint data types. The Number class can be used to represent integer values well beyond the valid range of the int and uint data types. The Number data type can use up to 53 bits to represent integer values, compared to the 32 bits available to int and uint.

53 位的最大值为:

2^53 - 1 == 9,007,199,254,740,989 => 16 位

因此,当您使用任何大于该值的值时, float 的内部工作原理将适用。

您可以阅读有关 float 的内容 here ,但简而言之,对于任何浮点值,前几个位用于指定乘法因子,该乘法因子确定该点的位置。这允许比实际可用位数表示的值范围更大的值 - 但代价是精度降低。

当您的值大于 Number 可能具有的最大可能整数值时,最低有效位(代表 0 和 1 的位)将被截断,以允许更高有效位(代表 2 的位) ^54) 存在 => 因此,您会丢失奇数。

有一个简单的方法可以解决这个问题:将所有 ID 保留为字符串 - 它们可以包含与系统可用字节一样多的数字;)无论如何,您不太可能用它们进行任何计算。

顺便说一句,如果您的值大于2^54-(1+2),您的数字将向下舍入到下一个 4 的倍数;如果您的值大于 2^55-(1+2+4),它们将向下舍入到下一个 8 的倍数,依此类推。

关于facebook - 为什么17位及以上的数字会自动变成偶数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9404919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com