21

st_sizeであると定義されていoff_tます。

off_t符号付き整数型として定義されています。

st_sizeが符号付き型として定義されているのはなぜですか? マイナスでもいいの?マイナスだとどういう意味ですか?

4

5 に答える 5

7

私が考えることができる最善の理由は、署名されていないバージョンのoff_tを追加の型として導入することを避けることです。POSIX には、似たような使い方の整数型がすでにたくさんあります。

それとは別に、st_sizeサイズが理にかなった概念ではない場合に -1 を格納できることはおそらく便利です。実装がこれを行うかどうかはわかりません.POSIXがst_size通常のファイルとシンボリックリンクを除いてコンテンツに要件を課している場所を見つけることができません...

于 2012-09-05T07:07:47.710 に答える
5

C の昇格規則の下では、異なるサイズの符号付き型を組み合わせた式は、含まれるサイズに関係なく、中間計算がオーバーフローしない限り、同じ算術的に正しい方法で動作します。ただし、符号なしの型を追加すると、コードの動作が整数サイズに大きく依存するようになります。

与えられた:

int test_size(off_t x, long y, long long z)
{
  return x-y > z;
}

が符号なしの場合off_t、そのサイズに応じてyに昇格しunsigned long、その型で計算が実行され、次に に昇格して符号付き比較signed long longz使用して比較するか、または にz昇格する可能性がunsigned long longあります。全体的な比較は符号なしで行われます。また、符号付き演算を使用して減算されるほどoff_t十分に小さい (および/またはlong十分に大きい) 可能性もあります (必ずしもそうではありません)。y

intたとえ負になることは決してないとしても、少なくとも と同じくらい大きなものを必要とするのに十分な大きさの量は、特定の符号付き型には収まらないが確実に収まると信じる理由がある場合にのみ、一般に符号なし型で表す必要があります。署名されていない相手で。このような状況はそれほど一般的ではありませんが、16 ビット システムの size_t には存在していました (単一のオブジェクトが 64K を超えることはアーキテクチャ上不可能でしたが、32K を超えるオブジェクトは一般的でした)。このようなシナリオは、ファイル システム インターフェイスではあまり魅力的ではないように思われます (32 ビットの署名付きでは不十分な場合は、32 ビットの署名なしでもおそらく十分ではないでしょう)。

于 2016-06-28T17:13:50.120 に答える
2

off_tファイル内のオフセットを定義します。これは、ファイルのサイズと同じにすることもできますが、逆方向にシークする場合など、負の値にすることもできます。

このオフセットとサイズの関係から、ファイルのサイズはファイル オフセットと同じ型になります。いずれにせよ、ファイルサイズはマイナスであってはなりません。

于 2012-09-05T06:56:01.380 に答える
1

POSIX の一部の fseek 関数は、オフセットとして負を受け入れる必要があると思います。

于 2012-09-05T08:40:59.243 に答える
0

off_t多くの関数でファイル オフセットを処理するために使用されます。一部の関数は特別な値 -1 を使用します (たとえばlseek、エラーが発生したことを通知するために使用します)。UNIX では、-1 の値に対応するために他の多くのデータ型が署名されています (例: time_t)。

于 2012-09-05T06:59:37.160 に答える