POSIX与 C99的组合是否允许ssize_t的取值比 -1更小?
根据POSIX,ssize_t 可以在从 -1 到 SSIZE_MAX 的范围内存储值。显然POSIX只需要 -1,并且从不需要更负的错误值,因为POSIX使用 errno 来指示错误代码。
然而,除了POSIX的约定之外,还有其他关于错误码的约定。例如,Linux内核将错误用负值表示,但错误码位于该负返回值的绝对值中。因此,-2、-3 等是有效的返回值。根据POSIX,这些不能存储到 ssize_t 中。
然而,据我所知,C99要求对有符号整数有若干表示方式。据我的理解,存在二进制补码、反码和符号-原码三种表示方式。C23据我理解只保留二进制补码表示,而C99已经要求对有符号类型 int8_t、int16_t、int32_t 和 int64_t 使用二进制补码(因此在具有反码和符号-原码表示的机器上,这些类型将不可用)。
假设我在为POSIX与 C99的组合编写软件。我能否相信比 -1 更负的值可以被存储到 ssize_t?换句话说,如果我开发一个自定义库,在返回值中以 ssize_t 方式返回负数的不同错误码(表示失败)或正数的大小值(表示成功,并告诉已处理的字节数),它会起作用吗?
或者 ssize_t 可能是一个特殊情况,就像 bool 那样,其在其中可以存储的值受实现的符合性约束所限制吗?
解决方案
虽然标准并不保证,但大多数已知实现会将 ssize_t 作为普通的有符号整数来存储。少数像Itanium和 Cerebras这样的VLIW架构可能会把NaT标志映射到 -1 的 ssize_t 值,尽管如此。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。