1. 程式人生 > >C++11——整型

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 charunsigned 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