簡體   English   中英

c中的unsigned int comparision

[英]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_MAX18446744073709551615 (通常在64位系統上),那么(strlen(s)-strlen(x))將是18446744073709551614 ,這顯然大於4294967295 (假設UINT_MAX4294967295 )。 因此,你看到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 intsize_t類型的隱式轉換容易出錯且難以檢測。 像PVS-Studio這樣的靜態代碼分析器非常適合自動發現這些錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM