首頁 > 軟體

深度解析C語言中資料的儲存

2022-05-24 18:02:12

前言

在VS編譯器裡有release和debug兩種形式,debug包含偵錯資訊,release不包含偵錯資訊,並會對程式進行優化

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("hehen");
	}
	
	return 0;
}

執行這個程式,結果是死迴圈列印hehe,為什麼呢?

我們看記憶體

在迴圈到第13次時,把儲存變數i的地方改為0,i<=12仍成立,形成死迴圈

這是debug下出現的情況,但是如果是release的設定下,就不會出現上面死迴圈的情況,原因在下面這個圖裡

在debug設定下,儲存i變數的地址比儲存arr陣列的地址高,可能會越界到i的地址導致死迴圈

在release設定下,儲存i變數的地址比儲存arr陣列的地址低,不會出現越界到i導致死迴圈

(如果你非寫一個死迴圈那就真的死迴圈了,release優化沒有那麼萬能)

資料型別介紹

型別 大小(單位為位元組)
char (字元資料型別)1
short (短整型)2
int (整形)4
long (長整型)4或8
long long (更長的整形)8
float (單精度浮點數)4
double (雙精度浮點數)8

long long是在C99增加的

long的大小和環境有關,32位元平臺上是4個位元組,64位元平臺上是8個位元組

這些都是C中內建的資料型別

型別的意義:

使用這個型別開闢記憶體空間的大小(大小決定了使用範圍)

看待記憶體空間的視角

1就是不同型別可以開闢不同大小的記憶體空間

對於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]

這些都是整型家族裡的資料型別,都分有符號和無符號型別

為什麼說字元資料型別也是整型呢?

因為字元的本質其實是ASCII 碼值,是整型,所以劃分到整型家族

一般我們都預設不加unsigned或signed的預設為是有符號的,但是char就有點特殊

char裡有三個

  • char
  • signed char
  • unsigned char

signed char就是有符號的char,unsigned char就是無符號的char,但是什麼都不加的char是有符號的還是無符號的標準是未定義的,取決於編譯器的實現,跟編譯器有關

其他都不加的int,short,long等都是預設為有符號的

那麼為什麼會有unsigned和signed之分呢?

因為生活中本來就有很多資料是沒有負數的,比如身高,體重,長度

也有很多資料是有正負之分的,比如溫度,放出或吸收熱量

所以我們需要用unsigned和signed來區分是否有正負之分

舉例子

int a = 10;

a是整型,有符號的整型,一個整型4個位元組,即32個bit

0000 0000 0000 0000 0000 0000 0000 1010 (原碼)

int a = -10;

1000 0000 0000 0000 0000 0000 0000 1010(原碼)

符號位上,0表示正數,1表示負數,而且符號位不算有效位,只表示正負

有符號的int可以存 (-231)~(231-1)大小的數位

unsigned int a = -10;

1111 1111 1111 1111 1111 1111 0110(-10的二補數)

無符號的int可以存0~232大小的數

因此,對於有正負的數,我們就用有符號的signed

對於沒有正負之分的數,我們就用無符號的unsigned

浮點數家族

(只要表示小數就可以使用浮點型)

 float
 double

float精度低,儲存的數值範圍較小

double精度高,儲存的數值範圍較大

構造型別

陣列型別

例如:

                      型別
int arr1[5];    ——>  int [5]
int arr2[8];    ——>  int [8]
char arr3[5]    ——>  char [5]

結構體型別

struct

列舉型別

enum

聯合型別

union

指標型別

int *pi;
char *pc;
float* pf;
void* pv;

空型別

void 表示空型別(無型別)

通常應用於函數的返回型別、函數的引數、指標型別

舉一個例子

void test(void);
//第一個void  表示函數不會返回值
//第二個void  表示函數不需要傳任何引數

void*
//void用於指標型別,以後會詳細講解

以上就是深度解析C語言中資料的儲存的詳細內容,更多關於C語言資料儲存的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com