2

我创建了一个带有可变参数(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

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

谢谢!

4

1 回答 1

4

因为您将整数文字作为参数传递,所以在 and 的情况下2-2这些将作为ints 传递。因此,您通过尝试读取NSInteger.

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

test(2, (NSInteger)-2);
于 2013-06-09T21:14:28.340 回答