为什么通过可变参数发送时,负NSInteger(long)值会变为垃圾?

时间:2013-06-09 21:11:01

标签: objective-c c variadic-functions

我已经创建了一个带有可变参数(NSIntegers)的C函数,如下所示:

NSInteger test(NSInteger arg, ...)
{
    va_list args;
    va_start(args, arg);
    NSInteger arg2 = va_arg(args, NSInteger);
    return arg + arg2;
}

在使用负秒值调用此函数时,它会以某种方式变为非常大的数字。

test( 2,  2); // result = 4
test(-2,  2); // result = 0
test( 2, -2); // result = 4294967296

但是,如果我使用int而不是NSInteger作为可变参数,那么一切都按预期工作。

NSInteger test2(NSInteger arg, ...)
{
    va_list args;
    va_start(args, arg);
    int arg2 = va_arg(args, int);
    return arg + arg2;
}

试验:

test2( 2,  2); // result = 4
test2(-2,  2); // result = 0
test2( 2, -2); // result = 0

我可能在这里失踪或做错什么?如果有人能指出我在这里正确的方向,那就太好了。

谢谢!

1 个答案:

答案 0 :(得分:4)

因为您将整数文字作为参数传递,所以在2-2的情况下,这些将作为int传递。因此,您尝试阅读NSInteger来调用未定义的行为。

要解决此问题,请使用显式强制转换:

test(2, (NSInteger)-2);