st_size
であると定義されていoff_t
ます。
off_t
符号付き整数型として定義されています。
st_size
が符号付き型として定義されているのはなぜですか? マイナスでもいいの?マイナスだとどういう意味ですか?
私が考えることができる最善の理由は、署名されていないバージョンのoff_t
を追加の型として導入することを避けることです。POSIX には、似たような使い方の整数型がすでにたくさんあります。
それとは別に、st_size
サイズが理にかなった概念ではない場合に -1 を格納できることはおそらく便利です。実装がこれを行うかどうかはわかりません.POSIXがst_size
通常のファイルとシンボリックリンクを除いてコンテンツに要件を課している場所を見つけることができません...
C の昇格規則の下では、異なるサイズの符号付き型を組み合わせた式は、含まれるサイズに関係なく、中間計算がオーバーフローしない限り、同じ算術的に正しい方法で動作します。ただし、符号なしの型を追加すると、コードの動作が整数サイズに大きく依存するようになります。
与えられた:
int test_size(off_t x, long y, long long z)
{
return x-y > z;
}
が符号なしの場合off_t
、そのサイズに応じてy
に昇格しunsigned long
、その型で計算が実行され、次に に昇格して符号付き比較signed long long
をz
使用して比較するか、または にz
昇格する可能性がunsigned long long
あります。全体的な比較は符号なしで行われます。また、符号付き演算を使用して減算されるほどoff_t
十分に小さい (および/またはlong
十分に大きい) 可能性もあります (必ずしもそうではありません)。y
int
たとえ負になることは決してないとしても、少なくとも と同じくらい大きなものを必要とするのに十分な大きさの量は、特定の符号付き型には収まらないが確実に収まると信じる理由がある場合にのみ、一般に符号なし型で表す必要があります。署名されていない相手で。このような状況はそれほど一般的ではありませんが、16 ビット システムの size_t には存在していました (単一のオブジェクトが 64K を超えることはアーキテクチャ上不可能でしたが、32K を超えるオブジェクトは一般的でした)。このようなシナリオは、ファイル システム インターフェイスではあまり魅力的ではないように思われます (32 ビットの署名付きでは不十分な場合は、32 ビットの署名なしでもおそらく十分ではないでしょう)。
off_t
ファイル内のオフセットを定義します。これは、ファイルのサイズと同じにすることもできますが、逆方向にシークする場合など、負の値にすることもできます。
このオフセットとサイズの関係から、ファイルのサイズはファイル オフセットと同じ型になります。いずれにせよ、ファイルサイズはマイナスであってはなりません。
POSIX の一部の fseek 関数は、オフセットとして負を受け入れる必要があると思います。
off_t
多くの関数でファイル オフセットを処理するために使用されます。一部の関数は特別な値 -1 を使用します (たとえばlseek
、エラーが発生したことを通知するために使用します)。UNIX では、-1 の値に対応するために他の多くのデータ型が署名されています (例: time_t
)。