一个浮点数应该被签名,为什么减法导致一个环绕?

时间:2012-07-09 19:08:30

标签: objective-c types type-conversion

float test=-1;

生成float,其值为-1。然而,

float test=arc4random()%500-500;

产生了巨大的价值,这些价值显然是由缓冲区溢出造成的 - 数字缠绕在一起。这不应该发生在float;为了踢,我试图看看Xcode是否会让我制作一个“签名浮动”,但它告诉我“浮动无法签名或未签名。”

我制作了一个解决方案,我签了一个int,然后把它投到float,但我真的很感激知道这是怎么回事。

2 个答案:

答案 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)

Objective-C中的

浮点数与C中的浮点数完全相同:由IEEE-754定义的固有符号。 http://en.wikipedia.org/wiki/Single_precision_floating-point_format