深度解析C語言中數(shù)據(jù)的存儲
前言
在VS編譯器里有release和debug兩種形式,debug包含調(diào)試信息,release不包含調(diào)試信息,并會對程序進行優(yōu)化
int main() { int i = 0; int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; for (i = 0; i <= 12; i++) { arr[i] = 0; printf("hehe\n"); } return 0; }
運行這個程序,結(jié)果是死循環(huán)打印hehe,為什么呢?
我們看內(nèi)存
在循環(huán)到第13次時,把存儲變量i的地方改為0,i<=12仍成立,形成死循環(huán)
這是debug下出現(xiàn)的情況,但是如果是release的配置下,就不會出現(xiàn)上面死循環(huán)的情況,原因在下面這個圖里
在debug配置下,儲存i變量的地址比儲存arr數(shù)組的地址高,可能會越界到i的地址導(dǎo)致死循環(huán)
在release配置下,儲存i變量的地址比儲存arr數(shù)組的地址低,不會出現(xiàn)越界到i導(dǎo)致死循環(huán)
(如果你非寫一個死循環(huán)那就真的死循環(huán)了,release優(yōu)化沒有那么萬能)
數(shù)據(jù)類型介紹
類型 | 大?。▎挝粸樽止?jié)) |
---|---|
char (字符數(shù)據(jù)類型) | 1 |
short (短整型) | 2 |
int (整形) | 4 |
long (長整型) | 4或8 |
long long (更長的整形) | 8 |
float (單精度浮點數(shù)) | 4 |
double (雙精度浮點數(shù)) | 8 |
long long是在C99增加的
long的大小和環(huán)境有關(guān),32位平臺上是4個字節(jié),64位平臺上是8個字節(jié)
這些都是C中內(nèi)置的數(shù)據(jù)類型
類型的意義:
使用這個類型開辟內(nèi)存空間的大?。ù笮Q定了使用范圍)
看待內(nèi)存空間的視角
1就是不同類型可以開辟不同大小的內(nèi)存空間
對于2,看下圖理解
類型的基本歸類
整型家族
char
unsigned char
signed char
short
unsigned short [int]
signed short [int]
int
unsigned int
signed int
long
unsigned long [int]
signed long [int]
在C99后又加了long long
long long
unsigned long long [int]
signed long long [int]
這些都是整型家族里的數(shù)據(jù)類型,都分有符號和無符號類型
為什么說字符數(shù)據(jù)類型也是整型呢?
因為字符的本質(zhì)其實是ASCII 碼值,是整型,所以劃分到整型家族
一般我們都默認不加unsigned或signed的默認為是有符號的,但是char就有點特殊
char里有三個
- char
- signed char
- unsigned char
signed char就是有符號的char,unsigned char就是無符號的char,但是什么都不加的char是有符號的還是無符號的標(biāo)準(zhǔn)是未定義的,取決于編譯器的實現(xiàn),跟編譯器有關(guān)
其他都不加的int,short,long等都是默認為有符號的
那么為什么會有unsigned和signed之分呢?
因為生活中本來就有很多數(shù)據(jù)是沒有負數(shù)的,比如身高,體重,長度
也有很多數(shù)據(jù)是有正負之分的,比如溫度,放出或吸收熱量
所以我們需要用unsigned和signed來區(qū)分是否有正負之分
舉例子
int a = 10;
a是整型,有符號的整型,一個整型4個字節(jié),即32個bit
0000 0000 0000 0000 0000 0000 0000 1010 (原碼)
int a = -10;
1000 0000 0000 0000 0000 0000 0000 1010(原碼)
符號位上,0表示正數(shù),1表示負數(shù),而且符號位不算有效位,只表示正負
有符號的int可以存 (-231)~(231-1)大小的數(shù)字
unsigned int a = -10;
1111 1111 1111 1111 1111 1111 0110(-10的補碼)
無符號的int可以存0~232大小的數(shù)
因此,對于有正負的數(shù),我們就用有符號的signed
對于沒有正負之分的數(shù),我們就用無符號的unsigned
浮點數(shù)家族
(只要表示小數(shù)就可以使用浮點型)
float
double
float精度低,存儲的數(shù)值范圍較小
double精度高,存儲的數(shù)值范圍較大
構(gòu)造類型
數(shù)組類型
例如:
類型
int arr1[5]; ——> int [5]
int arr2[8]; ——> int [8]
char arr3[5] ——> char [5]
結(jié)構(gòu)體類型
struct
枚舉類型
enum
聯(lián)合類型
union
指針類型
int *pi; char *pc; float* pf; void* pv;
空類型
void 表示空類型(無類型)
通常應(yīng)用于函數(shù)的返回類型、函數(shù)的參數(shù)、指針類型
舉一個例子
void test(void); //第一個void 表示函數(shù)不會返回值 //第二個void 表示函數(shù)不需要傳任何參數(shù) void* //void用于指針類型,以后會詳細講解
以上就是深度解析C語言中數(shù)據(jù)的存儲的詳細內(nèi)容,更多關(guān)于C語言數(shù)據(jù)存儲的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++的cout.tellp()和cout.seekp()語法介紹
無論是使用 cout 輸出普通數(shù)據(jù),用 cout.put() 輸出指定字符,還是用 cout.write() 輸出指定字符串,數(shù)據(jù)都會先放到輸出流緩沖區(qū),待緩沖區(qū)刷新,數(shù)據(jù)才會輸出到指定位置,本文給大家介紹一下C++的cout.tellp()和cout.seekp()語法,需要的朋友可以參考下2023-09-09c++實現(xiàn)reactor高并發(fā)服務(wù)器的詳細教程
這篇文章主要介紹了c++從零實現(xiàn)reactor高并發(fā)服務(wù)器,包括環(huán)境準(zhǔn)備和基礎(chǔ)知識介紹,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-03-03VSCode搭建STM32開發(fā)環(huán)境的實現(xiàn)步驟
因為VSCode免費且好用,可以安裝各種插件,本文主要介紹了VSCode搭建STM32開發(fā)環(huán)境的實現(xiàn)步驟,具有一定的參考價值,感興趣的可以了解一下2023-12-12OpenGL實現(xiàn)不規(guī)則區(qū)域填充算法
這篇文章主要為大家詳細介紹了OpenGL實現(xiàn)不規(guī)則區(qū)域填充算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02