2014-07-16 57 views
1

unsigned int = unsigned差異(均衡)

int = signed int = signed

signed long long int = singed long long = long long

unsigned long long int = unsigned long long

signed long int = signed long = long

unsigned long int = unsigned long

signed short int = signed short = short

unsigned short int = unsigned short

signed char = char

我想知道爲i上述相同用C中提到的類型的或C++? 如果是,在平衡彼此的同時想知道他們的意思,他們會再次相同嗎? (EX:typeid(signed long int) == typeid(long)

答:http://cpp.sh/3rm

+1

C中沒有'typeid'同樣在C中,'unsigned int'絕對不是'signed int'的類型,'signed char'不必與'char'是同一類型,那麼你的問題又是什麼? –

+1

C中類型不同的問題仍然適用。 'typeid'只是類型標識的運行時表現形式。一個問題在問題主體中清楚地說明,順便說一句,沒有必要爲「不清楚你要問的東西」而結束投票...... – rubenvb

+0

相關:[所有版本的C中都有簽名,無符號,長和短的所有有效類型和C++?](http://stackoverflow.com/questions/22493879/are-signed-unsigned-long-and-short-all-valid-types-in-all-versions-of-c-and-c) –

回答

2

有些類型是相同的,有些是明顯的(=不相同):

  • char,加入signedunsigned給你總共有三種不同的類型。
  • 對於short,int,longlong long,signed暗示,並且增加了什麼都不做。添加unsigned將爲您提供一組新的不同類型。
  • unsignedshortlonglong long可以跟int,但如果int有與否不給不同的類型。

原則上,所有不同類型的typeid應該是不同的。這意味着模板和函數重載解析將把它們視爲不同的類型,而例如,通過shortshort int都會調用相同的過載。

據我所知,這些規則是相同的C和C + +。如果我犯了一個錯誤,請告訴我,我正在把它寫在我頭頂。

要檢查這一點,您可以使用static_assert結合std::is_same的編譯時檢查:

#include <type_traits> 
using std::is_same; 

static_assert(!is_same<char, signed char>(), ""); 
static_assert(!is_same<char, unsigned char>(), ""); 
static_assert(!is_same<unsigned char, signed char>(), ""); 


static_assert(is_same<short, signed short>(), ""); 
static_assert(is_same<int, signed int>(), ""); 
static_assert(is_same<long, signed long>(), ""); 
static_assert(is_same<long long, signed long long>(), ""); 

static_assert(!is_same<short, unsigned short>(), ""); 
static_assert(!is_same<int, unsigned int>(), ""); 
static_assert(!is_same<long, unsigned long>(), ""); 
static_assert(!is_same<long long, unsigned long long>(), ""); 

static_assert(is_same<unsigned int, unsigned>(), ""); 
static_assert(is_same<short int, short>(), ""); 
static_assert(is_same<long int, long>(), ""); 
static_assert(is_same<long long int, long long>(), ""); 

int main(){} // only included to make the program link 

Live demo here

+0

有錯誤,如「錯誤C2057:預期常量表達式」。無論如何感謝澄清這一點。 這是一個比較:http://cpp.sh/3rm – Kitiara