float test=-1;

生成值为float-1。然而,
float test=arc4random()%500-500;

产生巨大的价值,显然是由缓冲区溢出-数字包围。这不应该在afloat时发生;对于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。

10-05 22:39
查看更多