float test=-1;
生成float
,其值为-1
。然而,
float test=arc4random()%500-500;
产生了巨大的价值,这些价值显然是由缓冲区溢出造成的 - 数字缠绕在一起。这不应该发生在float
;为了踢,我试图看看Xcode是否会让我制作一个“签名浮动”,但它告诉我“浮动无法签名或未签名。”
我制作了一个解决方案,我签了一个int
,然后把它投到float
,但我真的很感激知道这是怎么回事。
答案 0 :(得分:10)
arc4random()
根据手册页返回u_int32_t
,因此arc4random()%500-500
将是无符号整数,减去500将为您提供非常大的正值。试试这个:
float test = ((float)(arc4random() % 500))-500;
我制作了一个解决方案,我在其中创建了一个signed int,然后将其转换为 漂浮,但我真的很感激知道这是怎么回事/为什么会这样。
一次看一整行。首先,你有:
arc4random()
正如我上面所说,返回unsigned int。让我们假装它返回值12345
。接下来,你有模数运算符,所以你的表达式就像:
12345 % 500
也就是说345
。接下来,减去500:
345 - 500
你认为那会给你-155,但是没有 - 我们仍然在这里使用无符号整数领域,所以你真的得到4294967141
(或类似的东西 - 我的数学可能会关闭)。然后,最后,将它分配给浮点数:
float test = 4294967141;
一个浮点只有23位用于尾数,所以存储在test
中的值将在4294967141的一般邻域中,但精度较低,如4294970000。
答案 1 :(得分:0)
浮点数与C中的浮点数完全相同:由IEEE-754定义的固有符号。 http://en.wikipedia.org/wiki/Single_precision_floating-point_format