将int与size_t进行比较

时间:2010-09-04 11:15:33

标签: c casting

如果我有一个int和一个size_t变量,我可以比较它们:

int i=1;
size_t y=2;
if(i==y)
// do something..

或者我必须输入其中一个?

4 个答案:

答案 0 :(得分:55)

如果int为零或正数,则安全。如果它是否定的,并且size_t的排名等于或高于int,则int将转换为size_t,因此其负值将变为正值。然后将这个新的正值与size_t值进行比较,这可能(以惊人的不可能的重合)给出误报。要真正安全(并且可能过于谨慎),请先检查int是非负的:

/* given int i; size_t s; */
if (i>=0 && i == s)

并禁止编译器警告:

if (i>=0 && (size_t)i == s)

答案 1 :(得分:0)

size_t将是某种整数类型(尽管可能是无符号的,因此它可能会生成警告),因此应该自动为您完成相应的转换。

正如其他人已经说过的那样,您可能想要重新审视产生int的任何计算,如果您正在计算所需的大小,请首先查看是否可以在size_t中执行此操作东西。

答案 2 :(得分:0)

可以将size_t值与int值进行比较,int值将隐式转换为unsigned类型。

当您在比较中混合使用signedunsigned类型时,某些编译器会发出警告。在这种情况下,您可以明确地将signed值转换为适当的unsigned类型以禁止警告。

答案 3 :(得分:0)

如果您要将int类型与size_t(或任何其他库类型)进行比较,则由于进行了比较,因为int是带符号的,而size_t是无符号的,因此您将进行危险的比较,因此将根据您的编译器隐式转换其中之一/平台。最好的办法是将您的int i重写为:

decltype(y.size())i = 1;

这会将您的i分配为您要比较的安全类型,我认为这是一种好习惯。该解决方案在所有类型的迭代器中也很有用。通常,您不希望信任编译器为您强制转换,但是这样做有风险,而且有不必要的风险。