網站建設免費教程我是seo關鍵詞
字節(jié)與字符
計算機內存的基本單位是位(bit),字節(jié)(byte)通常指的是8位的內存單元,從這個意義上來說,字節(jié)指的就是描述計算機內存量的度量單位。
C++對字節(jié)的定義則有些不同,C++字節(jié)由至少能夠容納實現(xiàn)的基本字符集的相鄰位組成,也就是說,可能取值的數(shù)目必須等于或超過字符數(shù)目。最開始的基本字符集ASCII由于只支持拉丁字符,可以用8位來容納,因此ASCII編碼是1個字節(jié)表示一個字符。但是在國際編程可能需要使用更大的字符集,即Unicode,根據(jù)編碼方式可以分為UTF-8(變長編碼,使用1-4個字節(jié)表示一個字符)、UTF-16(變長編碼,使用2或4個字節(jié)表示一個字符)、UTF-32(定長編碼,使用4個字節(jié)表示一個字符)。
英文字符和漢字字符在UTF-8編碼環(huán)境下,測試結果如下:
#include <iostream>
#include <cstring>using namespace std;int main()
{char a = 'a';cout << a << endl; // 輸出:a// 1、‘中’字符超出了char單個字節(jié)的存儲范圍char b = '中'; // 編譯告警: overflow in conversion from 'int' to 'char' changes value from '14989485' to ''\37777777655'' [-Woverflow]cout << b << endl; // 輸出:亂碼// 2、‘中’字符在UTF-8編碼中占用字節(jié)數(shù)為3,char數(shù)組定義為4是為了在末位存儲結束符‘\0’// char bs1[2] = "中"; //編譯報錯:error: initializer-string for array of chars is too long [-fpermissive]char bs2[4] = "中";cout << bs2 << endl; // 輸出:中cout << strlen("中") << endl; // 輸出:3return 0;
}
整型
常用的整數(shù)類型有char、short、int、long、long long,根據(jù)是否能存儲負值,又可以進一步劃分為有符號整型和無符號整型。
由于系統(tǒng)環(huán)境或編譯器環(huán)境不同,每種整型所占的字節(jié)數(shù)可能會有差異,此處以64位編譯器為例,舉例說明整型的取值范圍:
類型 | 占用字節(jié)數(shù) | 取值范圍 |
---|---|---|
signed char | 1 | -2^7 ~ 2^7-1 |
unsigned char | 1 | 0 ~ 2^8-1 |
short | 2 | -2^15 ~ 2^15-1 |
unsigned short | 2 | 0 ~ 2^16-1 |
int | 4 | -2^31 ~ 2^31-1 |
unsigned int | 4 | 0 ~ 2^32-1 |
long | 4 | -2^31 ~ 2^31-1 |
unsigned long | 4 | 0 ~ 2^32-1 |
long long | 8 | -2^63 ~ 2^63-1 |
unsigned long long | 8 | 0 ~ 2^64-1 |
擴展1:為什么無符號類型和有符號類型的最大值相比會多一個2次方?
計算機內存儲數(shù)據(jù)是使用二進制來表示的。有符號類型的最高位會被用為符號位,而無符號類型則多了最高位用來表示數(shù)值。
擴展2:為什么在有符號類型中負數(shù)取值范圍會比正數(shù)多一位?
計算機內是使用補碼來存儲整數(shù)的(正數(shù)補碼是它本身,負數(shù)補碼=對應正數(shù)原碼取反+1)。以signed char類型為例,從概念上來說,0數(shù)值是可以分為+0(00000000)和-0(10000000)的,而這時候我們已經選擇用+0來表示數(shù)字0了,-0就可以用于表示其他值,將-0采用補碼規(guī)則是映射到-128的(正數(shù)128原碼為010000000,取反為101111111,再+1為110000000,截掉前面的溢出位1結果為10000000),因此自然而然就用于表示-128了。
bool
bool類型用于表示邏輯上的真和假,取值范圍為字面值true和false,其可以提升為int類型——true轉為1,false轉為0。
另外值得注意的是,任何數(shù)字值或指針值都可以隱式轉換為bool值,任何非零值轉為true,而零值轉為false。
wchar_t
前面提到,程序需要處理的字符集可能無法用一個8位的字節(jié)表示,此時C++有兩種處理方式:一種是編譯廠商可以將char定義為一個16位的字節(jié)或更長的字節(jié)(例如,在Java語言中char的長度就是2個字節(jié));另一種是使用寬字符類型wchar_t來表示擴展字符集(wchar_t是整數(shù)類型,具體類型取決于系統(tǒng)實現(xiàn)),通常會將每個字符存儲在一個2字節(jié)的內存單元中。
浮點類型
常見的浮點類型有float(單精度小數(shù))、double(雙精度小數(shù))、long double。float和double的區(qū)別點在于,通常double類型能夠表示的范圍更大且精度更高。體現(xiàn)為double能夠保證準確的有效位更多。
算術操作符
常見的5種基本算術操作符分為加(+)、減(-)、乘(*)、除(/)、取余(%)。
類型轉換
在C++ 中,一個 數(shù)據(jù)類型 的值可以被轉換成另一種數(shù)據(jù)類型的值,這個轉換就叫做類型轉換。在進行類型轉換時需要注意的是,如果是向上轉型的轉換(例如,float轉double,int轉long)通常是安全的,但如果是向下轉型的轉換(例如,long轉int,double轉float,浮點數(shù)轉整數(shù))就有可能會產生截斷或精度丟失問題。
在C++ 中,按轉換方式也可以大致劃分為兩種類型轉換——隱式轉換和顯式轉換。
隱式轉換
由編譯器自動完成的類型轉換稱為隱式轉換,也稱為自動轉換。
例如,在計算表達式時,C++會將bool、char、unsigned char、signed char和short值轉換為int,這些轉換也被稱為整型提升。
顯式轉換
當用戶手動將數(shù)據(jù)從一種類型更改為另一種類型時,這稱為顯式轉換,主要有以下三種方式:
-
C 樣式類型轉換(也稱為轉換符號)
-
函數(shù)符號(也稱為舊的 C++ 樣式類型轉換)
-
類型轉換運算符(
static_cast
、dynamic_cast
、const_cast
、reinterpret_cast
)
#include <iostream>using namespace std;int main()
{int num1 = 10;short num2 = (short)num1; // 1、C風格轉換int num3 = 10;long num4 = long(num3); // 2、舊的C++風格轉換int num5 = 10;unsigned int num6 = static_cast<unsigned int>(num5); // 3、使用了C++的類型轉換運算符return 0;
}