在Objective-C中传递长篇论文?

时间:2011-07-07 18:57:17

标签: iphone objective-c variables arguments truncation

我试图将long long类型作为参数传递给函数并失败。我可以将5000000000分配给long long变量,如下所示:

long long value = 5000000000;

但是当我尝试将该变量传递给方法时:

- (void)viewDidLoad
{
    [super viewDidLoad];

    long long value = 5000000000;

    [self test:value];
}

-(void) test:(long long)value
{
    printf("%d\n", value);
}

该值打印为705032704而不是5000000000.我在调试器中验证了这一点。 705032704的值是常量,所以看起来似乎发生了某种截断。

我准备用这个开始拔头发了。有人可以帮忙吗?

谢谢, 艾伦

3 个答案:

答案 0 :(得分:12)

您的printf正在尝试将其打印为带符号的int而不是long long。

长期使用%lld

答案 1 :(得分:4)

试试这个:

printf("%lld\n", value);

代码的问题是%d假定在那里打印的参数将是一个整数。因此,printf只会查看您的数字的几个字节,而不是整个数字,它看到的内容相当于二进制的705032704。

您可以自己验证:二进制5000000000如下(字节边界由|标记):

1|00101010|00000101|11110010|00000000

在Objective C中,整数存储在4个字节上,因此Objective C查看最后4个字节,它完全等于705032704.(注意705032704 = 5000000000 - 2 32 ,其中包含对于丢失的最左边字节中的最后一位。)

答案 2 :(得分:0)

我经历过类似的情况。请改用NSNumber:

-(void) test:(NSNumber*)value
{
    NSLog(@"%@",value);
}   

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self test:[NSNumber numberWithLongLong:5000000000]];
}