0

に表示するsize_t変数がありますNSLog。この変数には、送信されたバイト数が含まれます。

これを使用する場合:NSLog(@"%zu",myvariable);エラーメッセージは表示されませんが、数値がオーバーフローし、NSLog出力に32.768未満の数値が表示され続けます。何故ですか?-9,223,372,036,854,775,808から9,223,372,036,854,775,807までの値の範囲の値を表示することになっていますか?

ここにいくつかのコードがあります。NSlog self.bufferOffsetに表示したいのですが、これは送信されたバイトのおおよその量である必要があります。

        // If we don't have any data buffered, go read the next chunk of data.

        if (self.bufferOffset == self.bufferLimit) {
            NSInteger   bytesRead;

            bytesRead = [self.fileStream read:self.buffer maxLength:kSendBufferSize];

            if (bytesRead == -1) {
                [self stopSendWithStatus:@"File read error"];
            } else if (bytesRead == 0) {
                [self stopSendWithStatus:nil];
            } else {
                self.bufferOffset = 0;
                self.bufferLimit  = bytesRead;
            }
        }

        // If we're not out of data completely, send the next chunk.

        if (self.bufferOffset != self.bufferLimit) {
            NSInteger   bytesWritten;
            bytesWritten = [self.networkStream write:&self.buffer[self.bufferOffset] maxLength:self.bufferLimit - self.bufferOffset];
            assert(bytesWritten != 0);
            if (bytesWritten == -1) {
                [self stopSendWithStatus:@"Network write error"];
            } else {
                self.bufferOffset += bytesWritten;
            }

        }

             NSLog (@"%lu",self.bufferOffset);

そしてここに出力のいくつかがあります:

  2013-02-24 15:54:39.674 prog[298:303] 32768
  2013-02-24 15:54:39.728 prog[298:303] 4820
  2013-02-24 15:54:39.791 prog[298:303] 10820
  2013-02-24 15:54:39.853 prog[298:303] 16580
  2013-02-24 15:54:39.911 prog[298:303] 23780
  2013-02-24 15:54:39.965 prog[298:303] 28100
  2013-02-24 15:54:40.024 prog[298:303] 32768
  2013-02-24 15:54:40.080 prog[298:303] 6852
  2013-02-24 15:54:40.139 prog[298:303] 14052
  2013-02-24 15:54:40.197 prog[298:303] 18372
4

1 に答える 1

3

self.bufferOffsetコードには、バッファ内の最初の読み取りは行われているがまだ書き込まれていないバイトのオフセットが含まれているため、常に次のようになります。

 self.bufferOffset <= kSendBufferSize

これは(うまくいけば)NSLog()出力が32768によって制限される理由を説明しています。

self.bufferOffset書き込まれたバイトの総数ではありません。

備考:他の人がすでにコメントしているように、%zuフォーマットは変数で正しく機能しsize_tます。64ビットプラットフォームでsize_tは、は64ビットの符号なし整数です。例:

size_t s = 18446744073709551615ULL; // 2^64-1
NSLog(@"%zu", s);
// Output: 18446744073709551615
于 2013-02-24T15:06:19.160 に答える