为什么struct stat中的st_size字段已签名?

时间:2012-09-05 06:43:39

标签: c linux unix posix

st_size definedoff_t

off_t defined有符号整数类型

为什么st_size被定义为签名类型?这可能是消极的吗?如果是负面意味着什么呢?

5 个答案:

答案 0 :(得分:5)

我能想到的最好的理由是避免将无符号版本的off_t作为额外类型引入; POSIX已经有了大量具有类似用途的整数类型。

除此之外,当大小不是一个有意义的概念时,能够在st_size中存储-1可能是有用的;我不确定是否有任何实现这样做,我无法找到POSIX对st_size的内容提出任何要求,除了常规文件和符号链接...

答案 1 :(得分:2)

off_t定义文件中的偏移量,可以等于文件的大小,但也可以是负数,例如,如果向后搜索。

根据偏移量和大小之间的关系,文件的大小与文件偏移量的类型相同。无论如何,文件大小不应该是负数。

答案 2 :(得分:2)

根据C&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使用带符号算术减去。{/ p>

可能大到足以要求至少与int一样大的东西的数量,即使它们永远不会是负数,通常只有在有理由相信它们不会被取消时才用无符号类型来表示适合特定的签名类型,但肯定适合其未签名的对应物。这种情况并不常见,但在16位系统上存在size_t(在单个对象的架构上不可能超过64K,但超过32K的对象是常见的)。在文件系统接口中,这样的场景似乎不太引人注目(如果32位签名不够,32位无符号可能已经足够长时间了)。

答案 3 :(得分:1)

我认为POSIX中的某些fseek函数需要接受负数作为偏移量。

答案 4 :(得分:0)

off_t用于处理许多函数中的文件偏移。有些函数使用特殊值-1(例如lseek这样做会告诉您发生了错误)。许多其他数据类型在UNIX中签名以容纳-1值(例如time_t)。