有符号与无符号比较

  • 本文关键字:比较 无符号 符号 c
  • 更新时间 :
  • 英文 :

size_t a;
off_t b;
...
if(b<a) ...

正如预期的那样,编译器在此处发出"有符号与无符号比较"警告,因为off_t是有符号的,size_t是无符号的。有没有办法进行这样的比较,在任何平台上正常工作,而不使用 intmax_t/uintmax_t 和预处理器条件指令?

无论大小(size_t(和大小(off_t(等于什么,它都应该有效。它们可能具有任何值,例如:

sizeof(size_t)=4, sizeof(off_t)=8   (regular modern 32bit unix)
sizeof(size_t)=4, sizeof(off_t)=4   (older system)
sizeof(size_t)=8, sizeof(off_t)=4   (some 64bit system with 32bit filesystem support)

如果我只是将一个类型转换为另一个,则可能会发生数据丢失和不正确的结果。

编辑需要明确的是:b的负值不是问题,因为负b很容易检测到(if(b<0((,并且总是小于无符号a的任何值。问题是比较两种这样的类型的正值,我不知道哪种类型的宽度更大。

EDIT2 它与"off_t和ssize_t与其他类型进行比较"不重复,因为该问题是关于比较具有各种位宽的有符号类型,这是关于有符号类型与无符号类型; 并且该问题的第一个答案也不是对此的回答,因为答案是关于两种相同大小的类型,这里是两种未知大小的类型;此外,这个问题不仅与比较有关,还与避免警告有关

if(b < 0 || (b <= SIZE_MAX && (size_t)b < a))

应该在所有情况下都有效。

如果b是负数,那么显然它小于a a因为不能是负数(因为size_t是无符号的(。

如果b大于SIZE_MAX,那么显然它大于a因为a不能大于SIZE_MAX

否则,它们都在size_t的有效范围内,因此将它们作为size_t

比较就足够了。

No.

问题是"任何值"都包含负值,在这种情况下,您必须应用特殊代码来处理它,因为底层机器没有。

如果您知道您的值保证为非负数,则只需将它们强制转换为与最大操作数匹配的无符号类型即可。

最新更新