2011-12-27 15 views
32

C standardı (ISO/IEC 9899: 2011 veya 9899: 1999), <stddef.h>'da ptrdiff_t türünü tanımlar.ssize_t ve ptrdiff_t arasındaki fark nedir?

POSIX standardı (ISO/IEC 9945; IEEE Std 1003.1-2008), <sys/types.h>'da ssize_t türünü tanımlar.

  • Bu türler arasındaki fark nedir (veya neden her ikisi de neden gerekliydi)? ssize_t için alttaki esas tip ptrdiff_t için aynı değildir bir uygulama
  • var mı?
+3

belki de 'ssize_t' eklenmesi çağrısında ptrdiff_t'' in anlamının var? Bazen, imzalı bir boyut türü yararlıdır, eğer ara sıra '-1' değerini temsil edebilmek istiyorsanız. "Ptrdiff_t" nin semantiği "iki işaretçinin arasındaki fark" dır, ki bu tam olarak "boyut" ifadesinin semantiği değildir. –

+1

Muhtemelen ilgili Stadards komitelerde NIH paranoya biraz –

cevap

22

ssize_t için alttaki esas tipi ifadesi ptrdiff_t için aynı değildir bir uygulama var mı? Büyük bellek modeli ile

x86-16. İşaretçiler uzak (32 bit), ancak tek tek nesneler bir segmentle sınırlıdır (bu nedenle size_t'un 16-bit olmasına izin verilir).

+9

olmaz 'işaretçi fark sadece her iki işaretçileri aynı nesneye işaret zaman tanımlanmış olduğundan ptrdiff_t' ayrıca, bu durumda 16 bit olmak ... –

+4

@Dhris:' ptrdiff_t türünde yorumlanacağını 'bir uygulama tanımlı tiptir ve bir işaretçinin boyutunun makul görünmesini sağlar. İşaretçiler üzerindeki işlemlerin, bellek modeline aşina olan herkes için şaşırtıcı olmadığı ve 16 bitlik bir ptrdiff_t'nin 32 bitlik işaretçiler kullanarak kullanıcıları şaşırtacağı düşünülüyor. –

+7

@ChrisDodd: Bir nesne 65535 bayta kadar olabilir, bu nedenle geçerli bir işaretçi çıkarma işlemi kolayca 32767'yi aşabilir; 'ptrdiff_t' için, 65536 değerine kadar değerleri tutabilen imzalı bir tür istiyorsanız. –

18

Açık Grup temel özellikleri Sayı 7, IEEE Std 1003.1 2013 Baskı, <sys/types.h> açıklaması söyler:

tipi ssize_t aralığında [-1, SSIZE_MAX] en az değerlerini saklama kapasitesine sahiptir. Diğer bir deyişle,

, ssize_tancak, temsil negatif değerler kümesi ile sınırlı olabilir, imzalanmış sadece {-1}. Bir ptrdiff_t

, diğer taraftan, daha simetrik pozitif/negatif aralığına sahip olacak şekilde garanti edilir.

ben pratikte, ssize_t negatif aralıkta bu sınırlı olacağını olası görünmüyor itiraf, ama bu mümkün.

Elbette, başka bir fark, standart C veya C++ 'da programladığınız zaman ptrdiff_t kullanılabilir, ancak standart bir POSIX sistemini hedeflemedikçe ssize_t kullanılamayabilir.

+0

tarihi bilgiler için teşekkürler; Mevcut standart artık menzili zorunlu kılmasa bile, nereden geldiğini açıklamaya yardımcı olur. (Benim şu anki standardı araştırmam tam olarak neye benzediğimi göstermese de, oldukça kapsamlı olduğuna inanıyorum, bu yüzden 'geleceğin ifadesi' 2008 standardında görünmüyor.) –

+0

Ben değildim Günümüzden önce ssize_t' ile tanıdık. En iyi arama sonucundan ne öğrendiğimi işaret ediyordum. –

+2

[2008 'sys/types.h' standart] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html) aynı [[, {SSIZE_MAX}]' gereksinimine sahip 'ssize_t'. – jw013