[英]unsigned int comparision in c
int main()
{
unsigned int c = -1;
char *s = "Abc";
char *x = "defhe";
((strlen(s)-strlen(x))>c)? printf(s): printf(x);
}
c
的值是4294967295
並且(strlen(s)-strlen(x))
是4294967294
它應該打印x
但是它打印s值。我不知道為什么它是那樣的
c的值是4294967295,(strlen(s)-strlen(x))的值是4294967294
(strlen(s)-strlen(x))
得出4294967294
不一定是正確的。 它取決於系統上SIZE_MAX
的值。
如果SIZE_MAX
是18446744073709551615
(通常在64位系統上),那么(strlen(s)-strlen(x))
將是18446744073709551614
,這顯然大於4294967295
(假設UINT_MAX
是4294967295
)。 因此,你看到printf(s);
打印。
使用printf()
語句查看值並理解:
printf("%zu %u\n", strlen(s)-strlen(x), c);
您似乎使用格式說明符%u
輸出表達式strlen(s)-strlen(x)
,例如像這樣
printf( "%u\n", ( unsigned int )( strlen(s)-strlen(x)));
printf( "%u\n", c );
在這種情況下,輸出確實等於
4294967294
4294967295
但是,如果使用強制轉換將這些表達式輸出到size_t
類型和格式說明符%zu
,則會得到
printf( "%zu\n", strlen(s)-strlen(x));
printf( "%zu\n", ( size_t ) c );
和
18446744073709551614
4294967295
因此,表達式strlen(s)-strlen(x)
的值大於轉換為size_t
類型的變量c
的值。
如果sizeof( size_t )
等於sizeof( unsigned int )
則可以得到結果的預期結果。
這種從int
/ unsigned int
到size_t
類型的隱式轉換容易出錯且難以檢測。 像PVS-Studio這樣的靜態代碼分析器非常適合自動發現這些錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.