C 比较int与size\u t

C 比较int与size\u t,c,casting,C,Casting,如果我有一个int和一个size\t变量,我可以像这样比较它们吗: int i=1; size_t y=2; if(i==y) // do something.. 或者我必须对其中一个类型进行强制转换?size\u t将是某种整数类型(虽然可能是无符号的,因此可能会生成警告),因此应该自动为您执行相应的强制转换 正如其他人已经说过的,您可能希望重新访问生成int的任何计算,并看看如果您正在计算某件东西所需的大小,您是否可以首先在size\u t中进行计算。可以将size\u t值与int值进行

如果我有一个int和一个size\t变量,我可以像这样比较它们吗:

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

或者我必须对其中一个类型进行强制转换?

size\u t
将是某种整数类型(虽然可能是无符号的,因此可能会生成警告),因此应该自动为您执行相应的强制转换


正如其他人已经说过的,您可能希望重新访问生成
int
的任何计算,并看看如果您正在计算某件东西所需的大小,您是否可以首先在
size\u t
中进行计算。

可以将
size\u t
值与
int
值进行比较,
int
值将隐式转换为
unsigned
类型


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

如果
int
为零或正,则是安全的。如果为负值,且
size\u t
的秩等于或高于
int
,则
int
将转换为
size\u t
,因此其负值将变为正值。然后将这个新的正值与
size\u t
值进行比较,这可能(不太可能的巧合)给出假正值。为了真正安全(也许是谨慎),首先检查
int
是否为非负:

/* given int i; size_t s; */
if (i>=0 && i == s)
要抑制编译器警告,请执行以下操作:

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

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

decltype(y.size())i=1


这将您的i指定为您尝试比较的安全类型,我认为这是一个很好的实践。此解决方案在所有类型的迭代器中也很有用。您通常不希望信任编译器为您强制转换,可以,但这是有风险的,而且是不必要的风险。

您真的需要将
int
size\u t
进行比较吗?通常情况下,您不应该这样做,并且您可能错误地将
int
转换为
size\t
,或者在某个地方将其转换为
size\t
。只是为了了解:)比较int和size\t的“明显”情况是
snprintf()
。您可能需要对int或unsigned int进行边界检查,向量索引。在我看来,仅仅掩盖这样的编译器警告通常不是一个好主意。有更好的选择(例如,首先使用
size\u t
int
中的一个,而不是两个)。启用编译器优化时,该比较可能会导致
未定义的行为
大小
必须是无符号的。实际上,无符号类型产生的问题比它们解决的问题(用于大小时)要多。更好的建议是尽快将unsigned作为一个数量(强制转换为
int
)。在
INT_MAX
值附近可能会出现问题,但在无符号情况下,在零附近可能会出现问题,这在编程中更为常见。