为什么是blkcnt_t 如果测量块数,则为有符号值?

为什么是blkcnt_t 如果测量块数,则为有符号值?

<sys/types.h>在与类型相关的参考文献中blkcnt_t定义为:

块cnt_t 用于文件块计数。

它还指出:

块cnt_t和 off_t 应为有符号整数类型。

(看http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html#tag_13_67

我无法找到块数为负数的理由,因此我想知道为什么类型被定义为有符号?

虽然我无法想象使用具有消极的块数,我认为 blkcnt_t 可能会被分配一个消极的表示某种错误/异常情况的值?

有趣的事实是 blkcnt_t 类型是作为无符号引入的(请参阅这里),然后更改为签名(参见这里)。作为发生此更改的描述/理由,给出了此提交消息:

“blkcnt_t 和 off_t 应为有符号整数类型。”当网络更新操作的大小要求为负数时,这会导致 pacman 失败,而是计算出一个巨大的正数。

答案1

我想它的签名是为了支持签名算术,或者更确切地说,存储签名块计数增量(这就是绊倒了pacman并提示Cygwin 补丁你提到)。

在Linux内核中仍然是仍未签名

答案2

这可能只是为了向后兼容。在早期版本中没有blkcnt_t类型,但字段只是long。因此,当他们转向更灵活的规范时,他们可能希望保留该字段的符号性。

相关内容