1

合理的な説明がないように見える永続的な問題に出くわしました。問題は、メモリ バッファに格納されているファイルのサイズであり、符号なし整数for (i = size - 1; i >= 0; i--) {etc.}である for ループ内にあるようです。の場合に停止する代わりに、ラップアラウンドします。その結果、セグメンテーション違反が発生します。条件を に変更すると、問題が解決します。sizeii == 0i = 4294967295i > 0

でも、これってなんかおかしくないですか?C で for ループがどのように動作するかの重要な部分が欠けているに違いありません。初期化、条件付きチェック、インクリメント/デクリメント、条件付きチェックなどのスキームに従っていませんか?

どんな助けでも大歓迎です!

4

4 に答える 4

2

iが近づくとどうなるか見てみましょう0

  • i == 1: ループ以降は正常に実行されますi >= 0。から 1 を引きiます。現在iは 0 が含まれています。
  • i == 0: ループ以降は正常に実行されますi >= 0。から 1 を引きiます。iは署名されていないため、折り返されます。したがって、i現在は 4294967295 が含まれています。
  • i == 4294967295: ループは正常に実行されますi >= 0
  • 等々 ...

解決策は、何か他のもの(たとえばi > 0、あなたの例のように)をテストするかi、ファイルのサイズよりも小さい間に繰り返しとループごとに増やすことです。

于 2013-07-30T10:13:08.800 に答える
1

unsigned 型では、最上位ビットは符号ビットとして扱われません。あなたの場合、 unsigned int は4bytes(32 bits).

したがって、「0」をデクリメントする場合、その方法は2's complement1追加され0ます。これは4294967295であり、32 ビットすべてが 1 の場合にのみなる最大値です。したがって、結果は4294967295.

最大値 4294967295 からインクリメントする間 (つまり、32 ビットすべてが 1 の場合)、これをインクリメントすると、下位 32 ビットがすべて 0 になり、32ndビットが 1 になります。32ndそのため、unsigned int の 4 バイトの範囲外のビットにオーバーフローが発生しています。したがって、値は 0 になります。

一般に、符号なしタイプの場合は、からのラップ アラウンドがあり0....MaxValueます。上にインクリメントするときMaxValueは、 から再入力し0ます。以下にデクリメントするとき0は、 から再入力しMaxValueます。

于 2013-07-31T17:02:34.690 に答える