ssize_t和ptrdiff_t有什么区别?

时间:2011-12-27 20:33:36

标签: c posix

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不同的实现?

2 个答案:

答案 0 :(得分:27)

  

是否存在ssize_t的基础类型的实现   与ptrdiff_t不同?

x86-16具有大内存模型。指针远(32位),但单个对象仅限于一个段(因此size_t允许为16位)。

答案 1 :(得分:21)

Open Group Base Specifications Issue 7,IEEE Std 1003.1,2013 Edition,<sys/types.h>的描述说:

  

ssize_t类型能够存储至少在[-1,SSIZE_MAX]范围内的值。

换句话说,ssize_t已签名,它可以表示的负值集可能仅限于{-1}。

另一方面,ptrdiff_t保证具有更加对称的正/负范围。

我承认在实践中,ssize_t似乎不太可能在负范围内受到限制,但这是可能的。

当然,另一个区别是,只要您使用标准C或C ++进行编程,就可以使用ptrdiff_t,但除非您的目标是标准POSIX系统,否则ssize_t可能无法使用。