C++11——整型
C ++基本資料型別的大小
1Byte=8bit
1bit 儲存 2^1=2個值
#include <iostream>
int main()
{
std::cout << "bool:\t\t" << sizeof(bool) << " bytes" << std::endl;
std::cout << "char:\t\t" << sizeof(char) << " bytes" << std::endl;
std::cout << "wchar_t:\t" << sizeof(wchar_t) << " bytes" << std::endl;
//std::cout << "char16_t:\t" << sizeof(char16_t) << " bytes" << std::endl; // C++11, may not be supported by your compiler
//std::cout << "char32_t:\t" << sizeof(char32_t) << " bytes" << std::endl; // C++11, may not be supported by your compiler
std::cout << "unsigned short:\t\t" << sizeof(unsigned short) << " bytes" << std::endl;
std::cout << "signed short:\t\t" << sizeof(signed short) << " bytes" << std::endl;
std::cout << "short:\t\t" << sizeof(short) << " bytes" << std::endl;
std::cout << "unsigned int:\t\t" << sizeof(unsigned int) << " bytes" << std::endl;
std::cout << "signed int:\t\t" << sizeof(signed int) << " bytes" << std::endl;
std::cout << "int:\t\t" << sizeof(int) << " bytes" << std::endl;
std::cout << "long:\t\t" << sizeof(long) << " bytes" << std::endl;
std::cout << "long long:\t" << sizeof(long long) << " bytes" << std::endl; // C++11, may not be supported by your compiler
std::cout << "float:\t\t" << sizeof(float) << " bytes" << std::endl;
std::cout << "double:\t\t" << sizeof(double) << " bytes" << std::endl;
std::cout << "long double:\t" << sizeof(long double) << " bytes" << std::endl;
return 0;
}
int x;
std::cout << "x is " << sizeof(x) << " bytes" << std::endl;
#include <iostream>
int main()
{
unsigned short x = 65535; // largest 16-bit unsigned value possible
std::cout << "x was: " << x << std::endl;
x = x + 1; // 65536 is out of our range -- we get overflow because x can't hold 17 bits
std::cout << "x is now: " << x << std::endl;
return 0;
}
/*
x was: 65535
x is now: 0
*/
對於高階讀者,下面是幕後實際發生的情況:數字65,535由二進位制的位模式1111 1111 1111 1111表示。 65,535是無符號2位元組(16位)整數可容納的最大數字,因為它使用全部16位。 當我們給該值加1時,新值應該是65,536。 然而,65,536的位模式以二進位制表示為1 0000 0000 0000 0000,它是17位! 因此,最高位(即1)丟失,低16位全部剩餘(只能儲存16位,多出的一位自動被丟棄掉)。 位模式0000 0000 0000 0000對應於數字0,這是我們的結果。
當用兩個整數進行除法時,C ++會產生一個整數結果。由於整數不能保持小數值,因此任何小數部分都會被丟棄(而不是圓整!)。
仔細看看上面的例子,8/5產生值1.6。小數部分(0.6)被丟棄,1的結果依然存在。
- 規則:使用整數除法時要小心,因為您將丟失結果的任何小數部分
Fixed-width integers
C99定義了一組固定寬度的整數(在stdint.h
標頭檔案中)
如果您的編譯器不包含cstdint或stdint.h,好訊息是您可以下載Paul Hsieh的stdint.h標頭檔案的pstdint.h跨平臺相容版本。只需將pstdint.h檔案包含在您的專案中,它將為您的平臺定義適當大小的固定寬度整數型別。
由於C ++規範的疏漏,大多數編譯器都將int8_t和uint8_t分別定義為型別signed char
和unsigned char
,但這不是必需的。因此,std :: cin和std :: cout的工作方式可能與您所期望的不同。這是一個示例程式,顯示了這一點:
#include <cstdint>
#include <iostream>
int main()
{
int8_t myint = 65;
std::cout << myint;
return 0;
}
在大多數系統中,該程式將列印’A’(將myint視為字元)。但是,在某些系統上,這可能會按預期列印65。
為了簡單起見,最好避免int8_t和uint8_t(改用int16_t或uint16_t)。但是,如果使用int8_t或uint8_t,則應該小心任何將int8_t或uint8_t解釋為char而不是整數(包括std :: cout和std:cin)的函式。
- 規則:避免int8_t和uint8_t。如果你確實使用它們,請注意它們通常被視為字元。
Fast and least
為了解決上述缺點,C ++ 11還定義了兩組固定寬度的整數。
快速型別 (int_fast#_t) (where # = 8, 16, 32, or 64),int_fast32_t將為您提供至少32位的最快整數型別
最小型別(int_least#_t)為您提供了寬度至少為#位(其中#= 8,16,32或64)的最小整數型別。例如,int_least32_t會給你至少32位的最小整數型別。
整數最佳實踐
C ++中整數的最佳實踐如下所示:
- 當整數的大小無關緊要時,int應該是首選。例如,如果你要求使用者輸入他們的年齡,或者從1到10的數字,那麼int是16位還是32位(這些數字將適合任何一種)並不重要。這將涵蓋您可能遇到的絕大多數情況。
- 如果你需要一個變數保證是一個特定的大小,並希望效能,使用
int_fast#_t
。 - 如果你需要一個變數保證是一個特定的大小,並且希望在效能上優先考慮記憶體,使用
int_least#_t
。這在分配大量變數時最常使用。 - 如果您有令人信服的理由,請僅使用無符號型別。int_least#_t