2015-12-08 100 views
1

您可以證明下面的代碼:爲什麼(sizeof(int)> -1)爲false?

#include<stdio.h> 
int main() 
{ 
    if(sizeof(int) > -1) 
    { 
      printf("\nTrue\n"); 
    } 
    else 
    { 
      printf("\nFALSE\n"); 
    } 
} 

輸出是FALSE .....建議我的原因

+4

GCC甚至還爲這個'foo.c的一個警告:4:20:警告:符號和無符號整數表達式的比較[-Wsign-比較] if(sizeof(int)> -1)' - 您可以在'-Wall -Wextra'中輕鬆啓用gcc中的詳細警告,這是每個人都應該做的。 –

+0

[爲什麼是-1> sizeof(int)?](http://stackoverflow.com/q/3100365/995714) –

回答

2
sizeof 

產生一個無符號的類型(即size_t)的值。

sizeof(int) > -1表達,正常的算術轉換應用於和-1被轉換成無符號的類型的sizeof這導致巨大的無符號值小於-1更大。

+0

感謝您的回答 – Bhargav

7

sizeof(int)具有類型size_t,這是一個無符號整數類型。

-1具有類型int,這是一個有符號整數類型。

將帶符號整數與無符號整數進行比較時,首先將有符號整數轉換爲無符號整數,然後使用兩個無符號整數執行比較。

sizeof(int) > (unsigned int)-1是錯誤的,因爲(unsigned int)-1是大多數實現中的一個非常大的數字(等於UINT_MAX或適合於unsigned int的最大數字)。

+4

*將帶符號整數與無符號整數進行比較時,首先將有符號整數轉換爲無符號*僅當無符號整數類型的轉換等級大於或等於有符號整數類型的轉換等級時才成立。 – ouah

1

這是因爲sizeof運算符返回一個無符號整數類型。與有符號整數類型進行比較時,有符號整數轉換爲無符號整數。所以實際上,您將sizeof(int)與最大可能的無符號整數進行比較。

您可以強制大小由鑄造簽署:

#include <stdio.h> 

int main() 
{ 
    if((int)sizeof(int) > -1) 
    { 
      printf("\nTrue\n"); 
    } 
    else 
    { 
      printf("\nFALSE\n"); 
    } 
} 
+0

要挑剔,有符號的整數是_converted_ to unsigned。在這種情況下,它隱含地完成了,而不是通過程序員明確完成的轉換。 – Lundin

+0

@Lundin好吧,我改變它使用術語「轉換」。 –

相關問題