日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

深度解析C語言中數據的存儲_C 語言

作者:愛彈吉他的小奔同學 ? 更新時間: 2022-07-23 編程語言

前言

在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("hehe\n");
	}
	
	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用于指針類型,以后會詳細講解

原文鏈接:https://blog.csdn.net/iqrmshrt/article/details/124936663

欄目分類
最近更新