23

2 つのオブジェクトのサイズの違いを表すために使用する必要がある C の型はどれですか?

size_t署名されていないので、次のようなものです

size_t diff = sizeof (small_struct) - sizeof (big_struct);

明らかに正しくないでしょうし、署名された実際の同等物はないように私には思えます。

ptrdiff_t魅力的に聞こえますが、

  1. その名前が示すように、ポインターを減算するためのものです。
  2. たとえば、DOS のようなセグメント化されたプラットフォームでは、16 ビットで表現できる最大オブジェクト サイズが 64k であると読みました。ただし、far ポインターは、16 ビットのセグメント値と 16 ビットのオフセット値で構成されます。ptrdiff_tそのようなプラットフォームでも 32 ビットになるのではないでしょうか? その場合、2 つのオブジェクトのサイズの違いは 16 ビットで十分ですが、ptrdiff_t を使用すると 32 ビット幅の変数が得られるため、最適ではありません。

では、そのような値を扱うのに適した移植可能な型は何でしょうか?

Edit: 私はssize_tについて知っていますが、それは

  1. 標準 C の一部ではありません。
  2. 実際にはそのような使用を意図したものではなく、サイズまたは (負の) エラー値を返すためのものです。
4

4 に答える 4

18

そのようなオーバーフローの問題が本当に心配な場合 (特に、「負の」値が 以外の場所で折り返されるモジュラ演算で作業する場合~0)、2 つのケースに分けました。

if (a > b) {
    size_t diff = a - b;
} else {
    size_t diff = b - a;
    // code here subtracts diff rather than adds it, etc.
}
于 2013-01-07T19:07:26.373 に答える
9

あなたがやろうとしていることに対して100%安全であることが保証されている標準のデータ型はありません。証拠として、size_tが本当に である場合を想像してみてくださいuint64_t。これは完全に可能です。次に、一致する正の範囲がuint64_tあり、負の値も処理することが保証されている標準 C データ型はありません。

したがって、あなたの質問に対する率直な答えは「データ型なし」です(標準Cに厳密に準拠していると仮定すると、それが望ましいと思われます)。

ただし、ユースケースについては明確ではありません。モジュラ演算を利用して「負の」値を処理できる可能性があります。たとえば、次のコードは剰余算術のため、署名されているかのようにコードを動作させることができますd24size_t

#include <stdio.h>
#include <stdint.h>

int main()
{
    size_t d1 = sizeof(int32_t) - sizeof(int64_t);
    size_t d2 = sizeof(int64_t) + d1; // Add difference (even if d1 is "negative"*)

    printf("d1: %zu\n", d1);
    printf("d2: %zu\n", d2);

    return 0;
    // * By "negative" I mean that d1 would be negative if size_t were signed
}

モジュラー演算は、あなたの場合には十分ではないかもしれませんが、他の人にとっては十分かもしれません.

于 2013-01-07T19:11:42.423 に答える
2

値からすべての値を保持できる符号付き C 整数型はありませんsize_t

于 2013-01-07T19:10:45.793 に答える
-2

あなたはこれを行うことができます:

size_t diff = std::abs(static_cast <int> (sizeof (small_struct) - sizeof (big_struct)));
于 2014-03-22T16:35:44.373 に答える