2013-01-07 2 views
20

2つのオブジェクトのサイズの差を表すために使用するCの型はどれですか? size_tとして2つのsize_tを減算するタイプは?

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

のようなものは明らかに正しいことではないでしょうし、本当の署名と同等はありません私には思える、符号なしです。その名前は、それがポインタを差し引くためだと言うように

ptrdiff_tは一種の魅力的に聞こえるが、

  1. 私はこれを読んでいます。 DOSのようなセグメント化されたプラットフォームは、16ビットで表現できる最大オブジェクトサイズが64kです。しかし、farポインタは、16ビットのセグメント値と16ビットのオフセット値で構成されています。そのようなプラットフォームでもptrdiff_tを32ビットにしてもらえませんか? もしそうなら、2つのオブジェクトのサイズの差は16ビットしか必要としませんでしたが、ptrdiff_tを使用すると32ビット幅の変数が得られ、最適ではありませんでした。

このような値で作業するには、適切なポータブルタイプがありますか?

Edit: 私はssize_tの知っているが、それは実際には、このような使用のために、しかし、サイズや(負)のエラー値のいずれかを返すためのものではない標準のC.

  • の一部

    1. ではありません。
  • +0

    を 'ssize_t'は' size_t' –

    +1

    @AFAIK 'ssize_t'はPOSIXではなく、ISO C. –

    +2

    @RomanRで署名されています。 'ssize_t'はC標準ではなく、' size_t'の値はPOSIXの 'ssize_t'に適合するものではありません。 – ouah

    答えて

    8

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

    質問に対する鈍い答えは、「データ型なし」です(あなたが望むような標準Cを厳密に遵守していると仮定します)。

    あなたはユースケースでは明確ではありませんが、モジュラ演算を利用して "負の"値を扱うことができます。例えば、size_tが署名されたかのようにコードを作用させるためのモジュラ算術の4d2the following code結果は、:

    #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 
    } 
    

    モジュラー算術はあなたのケースではあなたのために十分な、それはかもしれない他の人のためではないことがあります。あなたがこれを行うことができ

    18

    私は、私はちょうど2例に分割し、そのようなオーバーフローの問題(モジュラー算術で作業する場合は特に、「負」の値が~0以外の場所に包む場合)については本当に心配しています:

    あり
    if (a > b) { 
        size_t diff = a - b; 
    } else { 
        size_t diff = b - a; 
        // code here subtracts diff rather than adds it, etc. 
    } 
    
    2

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

    +2

    あなたの実装では?それとも、規格によって特に禁止されていますか? :) – pmg

    +0

    私はすべての実装を意味しました。もちろん、すべての 'size_t '値が符号付き整数型に収まる実装もあります。 – ouah

    -2

    size_t diff = std::abs(static_cast <int> (sizeof (small_struct) - sizeof (big_struct))); 
    
    関連する問題