2

long long 型を引数として関数に渡そうとしましたが、失敗しました。次のように、long long 変数に 5000000000 を割り当てることができます。

long long value = 5000000000;

しかし、その変数をメソッドに渡そうとすると:

- (void)viewDidLoad
{
    [super viewDidLoad];

    long long value = 5000000000;

    [self test:value];
}

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

値は 5000000000 ではなく 705032704 として出力されます。デバッガーでこれを確認しました。705032704 の値は一定であるため、何らかの切り捨てが発生しているように見えます。

私はこれで髪を引っ張り始めようとしています。誰でも助けることができますか?

ありがとう、アラン

4

3 に答える 3

12

printf は long long ではなく signed int として出力しようとしています。

%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 に答える