float test=-1;
生成值为
float
的-1
。然而,float test=arc4random()%500-500;
产生巨大的价值,显然是由缓冲区溢出-数字包围。这不应该在a
float
时发生;对于kicks,我试图查看xcode是否允许我生成“有符号浮点”,但它告诉我“浮点不能有符号或无符号”。我制作了一个作品,在那里我做了一个带符号的
int
,然后把它转换成一个float
,但是我真的很感激知道这是怎么发生的/为什么发生的。 最佳答案
arc4random()
根据手册页返回一个u_int32_t
,因此arc4random()%500-500
将是一个无符号整数,减去500将得到一个非常大的正值。请改为:
float test = ((float)(arc4random() % 500))-500;
我做了一个工作,在那里我做了一个带符号的int,然后把它转换成
但我真的很感激知道这是怎么发生的。
一次看一整行。首先,你得:
arc4random()
如上所述,它返回一个无符号int。假设它返回值
12345
。接下来,你得到了模算子,所以你的表达式如下:12345 % 500
也就是说
345
。接下来,减去500:345 - 500
你可能会认为这会给你-155,但是没有——我们仍然在处理无符号整数,所以你真的会得到
4294967141
(或者类似的东西——我的数学可能不好)。然后,最后,将其分配给一个float:float test = 4294967141;
浮点只有尾数为23位,所以存储在
test
中的值将在4294967141的一般邻域中,但精度较低,如4294970000。