st_size
被定义为一个off_t
.
off_t
被定义为有符号整数类型。
为什么st_size
定义为有符号类型?可以是负数吗?如果是负数是什么意思?
我能想到的最好的理由是避免引入无符号版本的off_t
作为额外类型;POSIX 已经拥有大量具有相似用途的整数类型。
除此之外,能够在st_size
大小不是一个有意义的概念时存储 -1 可能很有用;st_size
我不确定是否有任何实现这样做,并且除了常规文件和符号链接之外,我找不到 POSIX 对内容的任何要求......
在 C 的提升规则下,如果没有任何中间计算溢出,则组合不同大小的有符号类型的表达式将表现出相同的算术正确方式,而不管涉及的大小如何。然而,添加无符号类型将使代码的行为更加依赖于整数大小。
鉴于:
int test_size(off_t x, long y, long long z)
{
return x-y > z;
}
如果off_t
是无符号的,则根据其大小,它可能会导致y
提升为unsigned long
,并在该类型上执行计算,然后将其提升为signed long long
并与z
使用有符号比较进行比较,或者可能导致z
提升为unsigned long long
,在这种情况下整体比较将以无符号方式进行。也有可能(尽管不一定可能)off_t
足够小(和/或long
足够大),y
可以使用有符号算术减去。
可能大到需要至少与 一样大的量int
,即使它们永远不会是负数,通常也应该由无符号类型表示,只有当有理由相信它们不适合特定的有符号类型但肯定适合时在其未签名的对应物中。这种情况并不常见,但在 16 位系统上存在 size_t(在架构上单个对象不可能超过 64K,但超过 32K 的对象很常见)。这种情况在文件系统接口中似乎不太引人注目(如果 32 位有符号还不够,那么 32 位无符号也可能在很长时间内也不够用)。
off_t
定义文件中的偏移量,它可以等于文件的大小,但也可以是负数,例如向后搜索。
从偏移量和大小之间的这种关系来看,文件的大小与文件偏移量具有相同的类型。无论如何,文件大小不得为负数。
我认为 POSIX 中的某些 fseek 函数需要接受负数作为偏移量。
off_t
用于处理许多函数中的文件偏移量。一些函数使用特殊值 -1(例如lseek
,这样做是为了告诉您发生了错误)。许多其他数据类型在 UNIX 中被签名以适应 -1 值(例如time_t
)。