文件大小可以是负数吗?为什么



关于/coreutils-8.12/src/ls.c,我发现了这样的评论:

/* POSIX requires that a file size be printed without a sign, even
when negative.  Assume the typical case where negative sizes are
actually positive values that have wrapped around.  */

第2639行

我的问题是:-他们所指的典型案例是什么?-文件大小可以是一个负数,除了在大文件和旧系统的溢出问题?—是,为什么?(我为什么要像他们在上面的评论中那样关心呢?)

我对其他系统也感兴趣,不仅仅是POSIX

这很可能意味着POSIX中的文件大小应该被视为无符号整数,而不是有符号整数。如果用32位整数表示> 2GB的文件大小,则显示为负数,但显然不是。

查看注释下面的代码:

static uintmax_t
unsigned_file_size (off_t size)
{
  return size + (size < 0) * ((uintmax_t) OFF_T_MAX - OFF_T_MIN + 1);
}

如果size为负,则通过添加某个定义值(对于32位数据类型,最可能是接近2^31的值等)将其更改为正数。

这可以防止典型的错误,如将2-4 GB的文件大小分配给一个有符号整数,这将导致一个负数,ls应该显示为正确的正文件大小。

最新更新