我试图将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的值是常量,所以看起来似乎发生了某种截断。
我准备用这个开始拔头发了。有人可以帮忙吗?谢谢, 艾伦
答案 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]];
}