C 各個資料型別

2021-10-24 04:57:55 字數 4127 閱讀 5458

c++目前分為兩種整型,一種無符號整型一種有符號整型。

有符號整形:

資料型別

占用空間

取值範圍

short

占用2位元組

-2^15 - 2^15 -1

int占用4位元組

-2^31 - 2^31-1

long

windows下占用4位元組,linux下4位元組(32位),8位元組(64位)

-2^31 - 2^31-1

longlong

占用8位元組

-2^63 - 2^63-1

首先我們來了解一下,整形型別的資料在記憶體中是如何儲存的?

以int為例:int占用4個位元組的空間,即4*8 = 32byte,而儲存在記憶體中一般是以二進位制方式儲存。正數在記憶體中表示用二進位制編碼即可表示(正整數的補碼是他的二進位制編碼)。負數在計算機中以補碼形式存在。

所以:int型別所能表達的最大數字為:0111 1111 1111 1111 1111 1111 1111 1111 (最高位表示符號位,正數符號位為0),對應其十進位制為2^31-1=2147483647,對應的16進製為:0x7fffffff。最高位為符號位所以是2的31次方。但是當所有都為0,即16進製為0x00000000時,其對應的十進位制為2的0次方為1。 所以不是從0開始而是從1開始,故要減去1。

負數的最大值是1000 0000 0000 0000 0000 0000 0000 0000(最高位表示符號位,負數符號位為1),其補碼(數值位取反,然後加1)為1000 0000 0000 0000 0000 0000 0000 0000。其對應的16進製為0x80000000。為2的^31次方。

我們常接觸的浮點型資料型別分為兩種,分別為單精度(float)和雙精度(double)兩種型別。

名稱占用空間

取值範圍

float

占用4個位元組

-3.8e38 - 3.8e38

double

占用8個位元組

-1.7e308 - 1.7e308

float及double屬於浮點型資料,與整型不同,整型的所有位元組數都用來表示資料的具體值,而浮點數,並不是所有位數都用來描述具體的值,他的32位位元組(float)或64位位元組(double)是這樣分布:

名稱符號位

指數字尾數字

float18

23double111

52以float為例:

seee eeee eddd dddd dddd dddd dddd dddd

s為符號位:0代表正數,1代表負數

e為指數字:二進位制科學計數法中的指數部分。其中單精度數為 8 位,雙精度數為 11 位。

d為尾數部分:用來表示浮點數的小數點後面數字。

以數字8.25為例,舉例說明一下浮點數如何儲存在計算機中。

首先8為正數,他的二進位制位1000,不會發生改變。

其次0.25轉換為二進位制是01。

所以8.25轉換為二進位制位1000.01,轉換為二進位制科學計數法表示為1.00001e3

指數字為3。所以轉換為指數為**為10000010(因為指數字是00000000-11111111,表示-127-128,所以1的指數**為100000000),所以3的指數**為10000010。

小數字為00001

所以整體在計算機內表示為:0 10000010 00001000000000000000000

所以他的最大取值範圍為2^128次方。即科學計數法3.4e+38.

字元型別char在計算機中儲存是通過ascii碼的形式儲存在計算機中,每乙個字元都在ascii碼表中有對應的數值。將字元轉換成ascii碼中的對應數值,將其儲存到計算機中。

c++中儲存字串有兩種形式:

c語言風格字串

c++引入的string類

char *風格

char*是乙個指向字串首字母的乙個指標

char 風格

代表乙個字串陣列,用陣列的方式儲存字串。

例如 char a= 「abcd」;

實則為:a[0] = 『a』,a[1] = 『b』,a[2]=『c』,a[3] = 『d』。這樣的方式來儲存。

這兩者之間有較大的區別,他們的不同點在於:

char 是變數,值可以改變,char是常量,值不能改變!

就是說char指向的是乙個位址,如果這個指標指向變了,那麼他所指向的值便會發生改變。但是像char中是乙個陣列,他的值,例如char num,num是乙個char型別陣列名字,也是該陣列首元素的位址,是常量,所以不能改變。例如char arr=「hello」,你可以讓arr = 『a』?arr已經變成了乙個常量,無法改變。

char對應的記憶體區域是持續可寫,而char指向的區域有時可寫,有時唯讀。

char指向的是乙個字串常量,即指向的記憶體區唯讀;char 指向他代表的陣列在陣列內的位置,始終可寫。

總結:char*本身是乙個字元指標變數,既可以指向字串常量,也可以指向字串變數,指向的型別決定了對應的字串能否改變。

如果我們定義了乙個字串常量:char * str = 「string」;是進行了如下的三步操作:

在記憶體的文字常量區域中開闢乙個記憶體空間,儲存字串常量「string」。

返回這個區域的位址,存放在棧中,作為值,賦給字元指標變數a

指標變數a指向了這個字串常量「string」。

此時如果我們在重新構造乙個char* str2 = 「string」,則c==a,只會執行第一步和第三步,因為這個常量已在記憶體中建立。

使用stl中封裝的string類,不用擔心記憶體不夠的問題,當你定義乙個字串不知道他的大小時,你可以選擇使用string,使用string可以避免記憶體不夠的情況,當你已知乙個字串大小,然後需要定義它的時候,可以使用char * 也可以使用string,但是最好使用string,因為使用char *,你不知道**指標會出錯,容易存在隱患。

char與char *之間轉換:

//char轉char*:直接進行賦值即可

char str = "hello";

char *str1 = str;

//char* 轉char:使用拷貝函式,不能直接進行賦值

const char * str = "hello";

char str1 = "world";

strncpy(str1,str.strlen(str)+1);//因為字串陣列後面需要加'/0'所以加1

//不可直接進行賦值,會出現記憶體中斷。

char * 與string之間轉換

//char*轉換string

//1.直接賦值,2.構造轉換實現

const char* str = "hello";

string str1 = str;//賦值

string str2(str,str+strlen(str))

//string轉char * :賦值

string str ="hello";

//char *str1 = st;//錯誤型別不同

//char *str2 = st.c_str();//錯誤型別不同

char * str3 = const_cast(str.c_str());

char與string之間轉換

//char轉string:1.直接賦值,2. 構造轉換實現

char str = "hello";

string st1 = str;//直接賦值

string st2(st,st+strlen(str));

//string轉char:使用拷貝函式實現,不能直接進行賦值

string str = "hello";

//char str1 = str;這種直接賦值是錯誤的

//char str2 = const_cast(str.c_str());轉換型別構造也是錯誤的

char str2 = "world";

strncpy(str2,str.c_str(),str.length()+1);//因為有'\0'所以要+1

Redis的各個資料型別操作

string 最簡單的字串型別鍵值對快取,也是最基本的 keys 檢視所有的key 不建議在生產上使用,有效能影響 type key key的型別 get set del 查詢 設定 刪除 set rekey data 設定已經存在的key,會覆蓋 setnx rekey data 設定已經存在的k...

Redis各個資料型別應用場景

redis各個資料型別應用場景,菜鳥教程 型別 簡介特性 場景string 字串 二進位制安全 可以包含任何資料,比如jpg或者序列化的物件,乙個鍵最大能儲存512m hash 字典 鍵值對集合,即程式語言中的map型別 適合儲存物件,並且可以像資料庫中update乙個屬性一樣只修改某一項屬性值 m...

redis學習 redis各個資料型別使用場景

一 回顧一下redis的幾個基本資料型別 string list set hash zset 回歸redis的本質,充當資料快取,降低磁碟io的操作的次數,提公升查詢響應速度 2 list 列表型別是用來儲存多個有序的字串,列表中的每個字串成為元素 element 乙個列表最多可以儲存 2的32次方...