最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言數(shù)據(jù)的存儲(chǔ)專項(xiàng)分析

 更新時(shí)間:2022年07月08日 10:06:59   作者:hania_w  
使用編程語言進(jìn)行編程時(shí),需要用到各種變量來存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么

數(shù)據(jù)的類型介紹

類型的基本歸類

在寫數(shù)據(jù)類型的介紹之前,我們首先來簡單介紹下 release版本與debug版本之間的在內(nèi)存上的區(qū)別:

我們先將下面的一段代碼在VS中運(yùn)行一下,得到的結(jié)果是截然不同的

	int i = 0;
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0; i <= 12; i++)
	{
		arr[i] = 0;
		printf("hehe\n");
	}

將這段代碼在debug版本下得到的結(jié)果是 hehe死循環(huán),如下圖所示

從這里可以看到,hehe是在死循環(huán)的

將這段代碼在Release版本下得到的結(jié)果是 13個(gè)hehe

根本的原因是這兩個(gè)版本下,數(shù)據(jù)存儲(chǔ)的方式不同

以下是簡圖:

上面這張圖就展示了兩者的區(qū)別,當(dāng)編譯器從低地址處往高地址處走時(shí),debug環(huán)境下,arr數(shù)組結(jié)束時(shí)如果再繼續(xù)往下運(yùn)行就會(huì)改變 i 的值,使 i的值初始化為0。release環(huán)境下arr數(shù)組結(jié)束時(shí)并不會(huì)改變i的值,因此并不會(huì)陷入死循環(huán)。

接著,回憶一下c語言中的數(shù)據(jù)基本類型:

1、整形家族有

char

注:字符類型的本質(zhì)是ASCII碼值,是整形,因此劃分到整形家族。

unsigned char
signed char

short

unsigned short [int]
signed short [int]

int

unsigned int
signed int

long

unsigned long [int]
signed long [int]

除了char類型,其他類型的數(shù)據(jù)在沒有特定的說明下,默認(rèn)是有符號(hào)類型。char類型取決于編譯器。

2、浮點(diǎn)數(shù)家族

float    精度低,存儲(chǔ)的數(shù)值范圍較小
double  精度高,存儲(chǔ)的數(shù)值范圍更大

3、構(gòu)造類型(自定義類型,我們可以創(chuàng)建出新的類型)

數(shù)組類型
結(jié)構(gòu)體類型  struct
枚舉類型  enum
聯(lián)合類型  union

4、指針類型

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

5、空類型

1、void 表示空類型(無類型)

2、通常應(yīng)用于函數(shù)的返回類型、函數(shù)的參數(shù)、指針類型 

看下面的代碼舉例

void test(void)
{
	//第一個(gè) void 表示函數(shù)沒有返回值
	//第二個(gè) void 表示函數(shù)不需要任何參數(shù)
	printf("hehe\n");
}
int main()
{
	test(1);
	return 0;
}

整形在內(nèi)存中的存儲(chǔ)

源碼、反碼、補(bǔ)碼

計(jì)算機(jī)中的整數(shù)有三種表示方法,即原碼、反碼和補(bǔ)碼
三種表示方法均有符號(hào)位和數(shù)值位兩部分,符號(hào)位都是
用0表示“正”,用1表示“負(fù)”,而數(shù)值位負(fù)整數(shù)的三種
表示方法各不相同。

原碼:直接將二進(jìn)制按照正負(fù)數(shù)的形式翻譯成二進(jìn) 制就可以。

反碼:將原碼的符號(hào)位不變,其他位依次按位取反就可以得到了。

補(bǔ)碼:反碼+1就得到補(bǔ)碼。

正數(shù)的原碼、反碼、補(bǔ)碼都一樣,對(duì)于整形來說:數(shù)據(jù)存放內(nèi)存中其實(shí)存放的是補(bǔ)碼

具體原因我們?cè)诖瞬欢嘧鼋忉尅?/p>

關(guān)于大小端的概念

什么是大小端?其實(shí)就是數(shù)據(jù)在內(nèi)存中的存儲(chǔ)模式,大端存儲(chǔ)模式和小端存儲(chǔ)模式。

大端(存儲(chǔ))模式:是指數(shù)據(jù)的低位保存在內(nèi)存的高地址中,而數(shù)據(jù)的高位,保存在內(nèi)存的低地址

中; 小端(存儲(chǔ))模式:是指數(shù)據(jù)的低位保存在內(nèi)存的低地址中,而數(shù)據(jù)的高位,,保存在內(nèi)存的高地址中。

下面我們來看一道題目:判斷當(dāng)前機(jī)器的存儲(chǔ)模式是大端存儲(chǔ)還是小端存儲(chǔ)。

#include <stdio.h>
	int check_sys()
	{
		int i = 1;
		return (*(char*)&i);
		//具體原因看下圖解釋
	}
	int main()
	{
		int ret = check_sys();
		if (ret == 1)
		{
			printf("小端\n");
		}
		else
		{
			printf("大端\n");
		}
		return 0;
	}

浮點(diǎn)型在內(nèi)存中的存儲(chǔ)

(-1)^S * M * 2^E

(-1)^s表示符號(hào)位,當(dāng)s=0,V為正數(shù);當(dāng)s=1,V為負(fù)數(shù)。

M表示有效數(shù)字,大于等于1,小于2。

2^E表示指數(shù)位。

例如 V=5.0 :浮點(diǎn)數(shù)存儲(chǔ)為 101.0

如果我們想算出S、M、E,那么小數(shù)點(diǎn)前面就只能有一位

例: V=9.5=1001.1=1.0011*2^3

因此 S=0,M=1.0011,E=3

但是,凡是都有例外,因此,并不是所有的浮點(diǎn)數(shù)都可以用這種方式表示的

例如:V=9.6=1001.10…與1001.11之間徘徊,無法精確的表示出來

float —> 4byte —>32bit

double—>8byte—>64bit

雖然double類型比float類型的精確度要大,但是他們依舊有可能無法將小數(shù)的內(nèi)存完整保存。

2、值得注意的是浮點(diǎn)數(shù)在內(nèi)存中使用S、M、E的形式來存儲(chǔ)的

對(duì)于32位的浮點(diǎn)數(shù),最高的1位是符號(hào)位s,
接著的8位是指數(shù)E,剩下的23位為有效數(shù)字M。  

對(duì)于64位的浮點(diǎn)數(shù),最高的1位是符號(hào)位S,
接著的11位是指數(shù)E,剩下的52位為有效數(shù)字M 

3、指數(shù)E是一個(gè)復(fù)雜的數(shù)

首先 E 是一個(gè)無符號(hào)整數(shù)這意味著, 如果E為8位,它的取值范圍為0 ~ 255;如果E為11位,它的取值范圍為0~2047。 但是,我們知道,科學(xué)計(jì)數(shù)法中的E是可以出現(xiàn)負(fù)數(shù)的,所以,存入內(nèi)存時(shí)E的真實(shí)值必須再加上一個(gè)中間數(shù),對(duì)于8位的E,這個(gè)中間數(shù)是 127;對(duì)于11位的E,這個(gè)中間數(shù)是1023。比如,2^10的E是10,所以保存成32位浮點(diǎn)數(shù)時(shí),必須保存成10+127=137,即10001001。

如果有錯(cuò)誤,希望大家評(píng)論或者私信指正!

到此這篇關(guān)于C語言數(shù)據(jù)的存儲(chǔ)專項(xiàng)分析的文章就介紹到這了,更多相關(guān)C語言數(shù)據(jù)存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++基于棧的深搜算法實(shí)現(xiàn)馬踏棋盤

    C++基于棧的深搜算法實(shí)現(xiàn)馬踏棋盤

    這篇文章主要為大家詳細(xì)介紹了C++基于棧的深搜算法實(shí)現(xiàn)馬踏棋盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 詳解C語言中不同類型的數(shù)據(jù)轉(zhuǎn)換規(guī)則

    詳解C語言中不同類型的數(shù)據(jù)轉(zhuǎn)換規(guī)則

    這篇文章給大家講解不同類型數(shù)據(jù)間的混合運(yùn)算與類型轉(zhuǎn)換,有自動(dòng)類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換,針對(duì)每種轉(zhuǎn)換方法小編給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-07-07
  • C語言數(shù)組詳細(xì)介紹

    C語言數(shù)組詳細(xì)介紹

    大家好,本篇文章主要講的是C語言數(shù)組詳細(xì)介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C++?socket通信遇到的問題及解決方法

    C++?socket通信遇到的問題及解決方法

    這篇文章主要介紹了C++?socket通信遇到的問題,通過代碼修改來解決這個(gè)問題,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • C語言實(shí)現(xiàn)共享單車管理系統(tǒng)

    C語言實(shí)現(xiàn)共享單車管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)共享單車管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++ new、delete(new[]、delete[])操作符重載需要注意的問題

    C++ new、delete(new[]、delete[])操作符重載需要注意的問題

    這篇文章主要介紹了C++ new、delete(new[]、delete[])操作符重載需要注意的問題,本文同時(shí)講解了兼容默認(rèn)的 new、delete 的錯(cuò)誤處理方式、多態(tài)的問題等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • c++中用TINYXML解析XML文件

    c++中用TINYXML解析XML文件

    這篇文章主要介紹了c++中如何用TINYXML解析XML文件,文中案例非常詳細(xì),幫助大家更好的了解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C 讀取ini文件的實(shí)例詳解

    C 讀取ini文件的實(shí)例詳解

    這篇文章主要介紹了C 讀取ini文件的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • 從頭學(xué)習(xí)C語言之switch語句和分支嵌套

    從頭學(xué)習(xí)C語言之switch語句和分支嵌套

    這篇文章主要為大家詳細(xì)介紹了C語言之switch語句和分支嵌套,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • VC++角色游戲中的人物初始化模塊代碼實(shí)例

    VC++角色游戲中的人物初始化模塊代碼實(shí)例

    這篇文章主要介紹了VC++角色游戲中的人物初始化模塊,對(duì)大家學(xué)習(xí)VC++有一定的幫助,需要的朋友可以參考下
    2014-08-08

最新評(píng)論

洪泽县| 贵德县| 盐津县| 满洲里市| 米泉市| 龙南县| 常山县| 南通市| 涿州市| 宜兰市| 萝北县| 永靖县| 宁夏| 拉萨市| 阳山县| 宾阳县| 江川县| 淅川县| 宁阳县| 苍梧县| 黑河市| 大姚县| 长垣县| 全椒县| 临江市| 陆丰市| 商丘市| 工布江达县| 利川市| 福建省| 巴中市| 图片| 永修县| 姚安县| 石景山区| 伊川县| 昌宁县| 社会| 平武县| 凉山| 红安县|