web-dev-qa-db-ja.com

ssize_tとptrdiff_tの違いは何ですか?

C標準(ISO/IEC 9899:2011または9899:1999)は、ptrdiff_tにタイプ<stddef.h>を定義しています。

POSIX標準(ISO/IEC 9945; IEEE Std 1003.1-2008)は、ssize_tにタイプ<sys/types.h>を定義しています。

  • これらのタイプの違いは何ですか(または両方が必要であると見なされた理由)?
  • ssize_tの基礎となる基本タイプがptrdiff_tの場合と同じではない実装はありますか?
42

Ssize_tの基礎となる基本タイプがptrdiff_tの場合と同じではない実装はありますか?

大容量メモリモデルのx86-16。ポインタは遠い(32ビット)が、個々のオブジェクトは1つのセグメントに制限されている(したがって、size_tは16ビットにすることができます)。

29
dan04

Open Group Base Specification Issue 7、IEEE Std 1003.1、2013 Edition、 <sys/types.h> の説明は次のように述べています。

タイプssize_tは、少なくとも[-1、SSIZE_MAX]の範囲の値を格納できます。

言い換えると、ssize_tは署名されていますが、but表現できる負の値のセットは、{-1}だけに制限される場合があります。

一方、ptrdiff_tは、より対称的な正/負の範囲を持つことが保証されています。

実際には、ssize_tが負の範囲でこれほど制限される可能性は低いと思われますが、可能です。

もちろん、別の違いは、標準のCまたはC++でプログラミングしているときはいつでもptrdiff_tを使用できることですが、標準のPOSIXシステムをターゲットにしていない限りssize_tは使用できない場合があります。

25
Adrian McCarthy