2

我试图将 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 值是恒定的,因此似乎正在发生某种截断。

我要开始用这个拔头发了。任何人都可以帮忙吗?

谢谢,艾伦

4

3 回答 3

12

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

%lld长期使用

于 2011-07-07T18:59:06.457 回答
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,它占最左边字节的最后一位,即丢失)。

于 2011-07-07T18:59:37.673 回答
0

我也经历过类似的情况。使用 NSNumber 代替:

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

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self test:[NSNumber numberWithLongLong:5000000000]];
}
于 2011-07-07T19:06:52.800 回答