2015-08-08 97 views
1

程序1:比較與負值的符號/無符號值之間

#include <stdio.h> 
int main() 
{ 
    if (sizeof(int) > -1) 
     printf("Yes"); 
    else 
     printf("No"); 
    return 0; 
} 

輸出:No

計劃2:

#include <stdio.h> 
int main() 
{ 
    if (2 > -1) 
     printf("Yes"); 
    else 
     printf("No"); 
    return 0; 
} 

輸出:Yes

問題:

  1. 程序1和程序2有什麼不同?
  2. 爲什麼sizeof(int)被認爲是unsigned
  3. 爲什麼程序2中的2被認爲是signed
+0

'2'是一個'signed int'文字。 '2u'將是'unsigned'。 –

回答

1

類型由操作者sizeof返回的值是size_t,其被指定爲一個無符號的類型(通常相當於unsigned long)。

簡單的純整數常量,像2-1總是int類型的,和int簽署。

如果你想要一個無符號的整數字面量,你必須添加U後綴,如2U

+0

「*和int有符號*」 - 是不是實現定義是否'int'是'signed'或'unsigned'? –

+1

@CoolGuy Yoiu're正在考慮'char',所有其他整數類型都被簽名。 –

+2

@Cool Guy @JoachimPileborg:或'int'位域。 – cremno

0

這是因爲sizeof運算符返回size_t中的值。這應該是一個無符號類型,通常實現爲unsigned int

編號2本身是int而不是unsigned int

2

這是常見的問題通常算術轉換之間的有符號和無符號整數。 sizeof運算符返回size_t類型的值,即<stddef.h>(另請參閱this answer)中定義的一些實現定義的無符號整數類型。

整數常量-1的類型爲int。當size_t被實現爲「至少」unsigned int(這很可能發生在您的情況下),那麼二元運算符<的兩個操作數都將轉換爲無符號類型。無符號值不能爲負值,因此-1會變成大數。