gpt4 book ai didi

objective-c - 应该对 float 进行签名,那么为什么减法会导致环绕?

转载 作者:搜寻专家 更新时间:2023-10-30 19:54:12 25 4
gpt4 key购买 nike

float test=-1;

产生一个float,值为-1。然而,

float test=arc4random()%500-500;

产生的巨大值显然是由缓冲区溢出引起的——数字环绕。 float 不应该发生这种情况;为了好玩,我试着看看 Xcode 是否会让我制作一个“带符号的 float ”,但它告诉我“ float 不能被签名或未签名。”

我制作了一个变通方法,我制作了一个带符号的 int,然后将其转换为 float,但我非常希望知道这是如何/为什么发生的。

最佳答案

arc4random() 根据手册页返回一个 u_int32_t,所以 arc4random()%500-500 将是一个无符号整数,减去 500 会给你一个非常大的正值。试试这个:

float test = ((float)(arc4random() % 500))-500;

I produced a work-around where I made a signed int, then cast it to a float, but I'd really appreciate knowing how/why this happened.

一次看整条线。首先,你有:

arc4random()

正如我上面所说,它返回一个无符号整数。我们假设它返回值 12345。接下来,您有模数运算符,所以您的表达式类似于:

12345 % 500

也就是说 345。接下来,减去 500:

345 - 500

你会认为这会给你 -155,但不是 - 我们仍然在无符号整数领域工作,所以你真的得到 4294967141(或类似的东西 - - 我的数学可能不对)。然后,最后,您将其分配给一个 float :

float test = 4294967141;

float 的尾数只有 23 位,因此存储在 test 中的值将在 4294967141 的一般邻域内,但精度较低,例如 4294970000。

关于objective-c - 应该对 float 进行签名,那么为什么减法会导致环绕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11401474/

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