根据 C 的提升规则,组合不同大小的有符号类型的表达式将表现出相同的算术正确方式,无论涉及的大小如何,前提是没有任何中间计算溢出。然而,添加无符号类型将使代码的行为更加依赖于整数大小。
鉴于:
int test_size(off_t x, long y, long long z)
{
return x-y > z;
}
Run Code Online (Sandbox Code Playgroud)
如果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已经有大量使用相似的整数类型。
除此之外,st_size在大小不合理的情况下能够存储-1 可能很有用;我不确定是否有任何实现方式,而且我找不到POSIX st_size对常规文件和符号链接以外的内容有何要求...
| 归档时间: |
|
| 查看次数: |
7050 次 |
| 最近记录: |