【问题标题】:Passing long long argument in Objective-C?在 Objective-C 中传递 long long 参数?
【发布时间】:2011-09-30 17:37:49
【问题描述】:

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

我正要开始用这个把我的头发拉出来。有人可以帮忙吗?

谢谢, 艾伦

【问题讨论】:

  • 你说得对,截断正在发生; 705032704 正是 5000000000 的低 32 位。

标签: iphone objective-c variables arguments truncation


【解决方案1】:

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

长期使用%lld

【讨论】:

  • 谢谢,我知道这很简单! Xcode 调试器的行为让我很困惑。
【解决方案2】:

试试这个:

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

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

你可以自己验证一下:二进制的5000000000如下(字节边界用|标记):

1|00101010|00000101|11110010|00000000

在Objective C中,整数存储在4个字节上,所以Objective C查看最后4个字节,正好等于705032704。(注意705032704 = 5000000000 - 232,其中占最左边字节中丢失的最后一位)。

【讨论】:

    【解决方案3】:

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

    -(void) test:(NSNumber*)value
    {
        NSLog(@"%@",value);
    }   
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        [self test:[NSNumber numberWithLongLong:5000000000]];
    }
    

    【讨论】:

    • 如果您需要将 NSNumber 放入集合类等中,则使用它是一种很好的做法,但是有人无意中听到,如果您必须这样做,标量值会快得多很多次。
    猜你喜欢
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 2017-07-14
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多