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

C語言詳細分析不同類型數(shù)據(jù)在內(nèi)存中的存儲

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

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

在我們之前的學(xué)習當中我們已經(jīng)介紹了基本的內(nèi)置類型

char 字符數(shù)據(jù)類型

short 短整型

int 整形

long 長整型

long long 更長的整形

float 單精度浮點數(shù)

double 雙精度浮點數(shù)

這些類型的意義是:

1.使用這個類型開辟內(nèi)存空間的大小,大小決定了使用范圍

2.如何看待內(nèi)存空間的視角。

類型的基本歸類

整形

整形中分為有符號整形和無符號整形,因為我們生后中有些數(shù)值需要有正數(shù)和負數(shù)之分,例如溫度我們就可以使用有符號整形,但是有些不需要負數(shù)的數(shù)值例如身高,我們就可以使用無符號整形。

char

unsigned char

signed char

short

unsigned short [int]

signed short [int]

int

unsigned int

signed int

long

unsigned long [int]

signed long [int]

浮點型

float

double

構(gòu)造類型

數(shù)組類型

結(jié)構(gòu)體類型 struct

枚舉類型 enum

聯(lián)合類型 union

指針類型

int pi;

char pc;

float pf;

void pv;

空類型

void表示空類型(無類型)

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

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

我們都知道,創(chuàng)建一個變量需要在內(nèi)存中開辟空間,那變量究竟是怎么在內(nèi)存當中存儲的呢。我們又要提到原碼、反碼、補碼的概念了。

在計算機中整數(shù)有三種表示方式即原碼、反碼、補碼,他們都有符號位和數(shù)值位,符號位用0表示正數(shù),用1表示負數(shù)。

正整數(shù)的原碼、反碼、補碼相同,都是直接將屬豬按照正負數(shù)的形式翻譯成二進制形式就可以得到原碼。

負整數(shù)的原碼、反碼、補碼

原碼

直接將數(shù)值按照正負數(shù)的形式翻譯成二進制形式就可以得到原碼

反碼

將原碼的符號位不變,其他位一次按位取反就可以得到反碼

補碼

反碼+1就是補碼

對于一個整形,數(shù)據(jù)在內(nèi)存當中存放的其實是他的補碼。那么為什么是補碼而是不是原碼呢,原因是使用補碼,可以將符號位和數(shù)值域統(tǒng)一處理,同時加法和減法也可以統(tǒng)一處理,我們的cpu只有加法器,此外,補碼與原碼相互轉(zhuǎn)換,其運算過程是相同的,不需要額外的硬件電路。

例如:

1 - 1
因為cpu中只有加法器,所以我們需要將減法轉(zhuǎn)化為加法,1+ (-1)如果內(nèi)存中存儲的是原碼,那么他們相加的結(jié)果為
00000000 00000000 00000000 00000001 1的原碼
10000000 00000000 00000000 00000001 -1的原碼
10000000 00000000 00000000 00000010 相加為-2
我們運算的答案是錯誤的,但是當我們存儲的是補碼時:
00000000 00000000 00000000 00000001 1的補碼
11111111 11111111 11111111 11111111 -1的補碼
00000000 00000000 00000000 00000000 相加0
使用補碼運算時,得到正確的答案

int main()
{
	int a = 20;
	int b = -10;
	return 0;
}

如上圖編譯器為了方便顯示的是16進制數(shù),其實對于一個整形,數(shù)據(jù)在內(nèi)存當中存放的還是他的補碼,我們可以是嘗試還原一下。

例如**-10**
原碼:10000000 00000000 00000000 00001010
反碼:11111111 11111111 11111111 11110101
補碼:11111111 11111111 11111111 11110110
將他的補碼轉(zhuǎn)換成16進制就變成了ff ff ff f6,跟我們通過調(diào)試看到的內(nèi)容一樣

但是我們通過對比發(fā)現(xiàn)雖然存儲的是補碼,但是存儲的順序好像不一樣,這是怎么回事呢?

大小端介紹

當我們的數(shù)據(jù)大于一個字節(jié)時,數(shù)據(jù)的存儲就有了順序問題。例如:一個十六進制數(shù)0x11223344,我們說11為數(shù)據(jù)的高位,44為數(shù)據(jù)的低位。

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

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

int main()
{
	int a = 0x11223344;
	return 0;
}

我們通過調(diào)試得出,在vs2019中為小端存儲模式,因為數(shù)據(jù)的低位44存儲在地址處,高位11存儲在高地址處。

一道筆試題

我們通過一道筆試題來鞏固一下我們剛才所總結(jié)的知識。題目:請簡述大端字節(jié)序和小端字節(jié)序的概念,設(shè)計一個小程序來判斷當前機器的字節(jié)序。

小端字節(jié)序存儲

把數(shù)據(jù)的低位存儲在內(nèi)存的低地址處,高位字節(jié)的內(nèi)容,存儲在內(nèi)存的高地址處 大端字節(jié)序存儲 把數(shù)據(jù)的低字節(jié)的內(nèi)容,存放到內(nèi)存的高地址處,高字節(jié)內(nèi)容,存放在低地址處

int check_sys()
{
	int a = 1;
	return *(char*)&a;
}
int main()
{
	if (check_sys() == 1)
	{
		printf("小端存儲\n");
	}
	else
	{
		printf("大端存儲\n");
	}
	return 0;
}

浮點數(shù)在內(nèi)存中的存儲

首先我們通過一段代碼來觀察浮點數(shù)在內(nèi)存中的存儲

int main()
{
	int n = 9;
	float* pFloat = (float*)&n;
	printf("n的值為:%d\n", n);
	printf("*pFloat的值為:%f\n", *pFloat);
	*pFloat = 9.0;
	printf("num的值為:%d\n", n);
	printf("*pFloat的值為:%f\n", *pFloat);
	return 0;
}

以我們的認識,使用%d打印應(yīng)該打印9使用%f打印應(yīng)該打印9.0,但事實是這樣的嘛

我們將代碼跑起來發(fā)現(xiàn),并非我們所認識的,那這說明了什么,說明了浮點型與整形在內(nèi)存當中的存儲規(guī)則是不一樣的,那我們先了解一下浮點數(shù)究竟怎么儲存的。

浮點數(shù)存儲規(guī)則

根據(jù)國際標準IEEE(電氣和電子工程協(xié)會)754,任意一個二進制浮點數(shù)v可以表示成下面的形式:

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

(-1)^S表示符號位,當S=0,V為正數(shù);當S=1,V為負數(shù)。

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

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

例如:十進制5.0,寫成二進制是101.0,相當于1.0122

所以s = 0,m = 1.01, e = 2。

IEEE 754規(guī)定:

對于32位的浮點數(shù),最高的1位是符號位s,接著的8位是指數(shù)E,剩下的23位為有效數(shù)字M。對于64位的浮點數(shù),最高的1位是符號位S,接著的11位是指數(shù)E,剩下的52位為有效數(shù)字M。

IEEE 754對有效數(shù)字M和指數(shù)E,還有一些特別規(guī)定:

前面說過, 1≤M<2 ,也就是說,M可以寫成 1.xxxxxx 的形式,其中xxxxxx表示小數(shù)部分。IEEE 754規(guī)定,在計算機內(nèi)部保存M時,默認這個數(shù)的第一位總是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的時候,只保存01,等到讀取的時候,再把第一位的1加上去。這樣做的目的,是節(jié)省1位有效數(shù)字。以32位浮點數(shù)為例,留給M只有23位,將第一位的1舍去以后,等于可以保存24位有效數(shù)字。

至于指數(shù)E,情況就比較復(fù)雜:

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

既然我們可以將浮點數(shù)存儲,我們就可以將他們?nèi)〕鰜?,但是指?shù)E從內(nèi)存中取出分為三種情況:

E不全為0或不全為1

這時,浮點數(shù)就采用下面的規(guī)則表示,即指數(shù)E的計算值減去127(或1023),得到真實值,再將 有效數(shù)字M前加上第一位的1。

E全為0

這時,浮點數(shù)的指數(shù)E等于1-127(或者1-1023)即為真實值,有效數(shù)字M不再加上第一位的1,而是還原為0.xxxxxx的小數(shù)。這樣做是為了表示±0,以及接近于0的很小的數(shù)字。

E全為1

這時,如果有效數(shù)字M全為0,表示±無窮大(正負取決于符號位s)

剖析題目

這些就是浮點數(shù)在內(nèi)存當中的存儲規(guī)則,了解了這些后讓我們回到最開始的那道題,我們進行分析。

首先我們創(chuàng)建了一個整形變量,那么他在內(nèi)存中存儲的是什么呢?是他的補碼00000000000000000000000000001001,當我們將他看作一個浮點數(shù)打印時,我們可以得到S = 0,M = 000 0000 0000 0000 0000 1001,E = 00000000。所以經(jīng)過計算(-1)^ 0 × 0.00000000000000000001001×2 ^ (-126) = 1.001×2 ^ (-146), 所以根據(jù)規(guī)則他是一個非常接近0的數(shù),使用浮點數(shù)打印就是0.000000

筆試題的第二部分,我們將一個浮點型使用整形打印,同樣的道理,我們先將9.0用浮點數(shù)的方式存進內(nèi)存當中,9.0寫成二進制為1001.0,可以寫成(-1)^0 * 1.001*2^3,我們可以推出二進制形式:0 10000010 001 0000 0000 0000 0000 0000,所以將他作為一個整形打印時就會是一個非常大的數(shù)為1091567616

到此這篇關(guān)于C語言詳細分析不同類型數(shù)據(jù)在內(nèi)存中的存儲的文章就介紹到這了,更多相關(guān)C語言數(shù)據(jù)存儲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言計算連續(xù)無序數(shù)組中缺省數(shù)字方法詳解

    C語言計算連續(xù)無序數(shù)組中缺省數(shù)字方法詳解

    這篇文章主要介紹了C語言計算連續(xù)無序數(shù)組中缺省數(shù)字方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習吧
    2023-02-02
  • Qt實現(xiàn)簡單動態(tài)時鐘

    Qt實現(xiàn)簡單動態(tài)時鐘

    這篇文章主要為大家詳細介紹了Qt實現(xiàn)簡單動態(tài)時鐘,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語言實現(xiàn)楊輝三角實例

    C語言實現(xiàn)楊輝三角實例

    這篇文章主要介紹了C語言實現(xiàn)楊輝三角的方法,主要通過數(shù)組簡單實現(xiàn),具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-09-09
  • C++中讀寫txt文件并分離字符的方法

    C++中讀寫txt文件并分離字符的方法

    今天小編就為大家分享一篇C++中讀寫txt文件并分離字符的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Visual Studio 2019修改編碼UTF-8的實現(xiàn)

    Visual Studio 2019修改編碼UTF-8的實現(xiàn)

    這篇文章主要介紹了Visual Studio 2019修改編碼UTF-8的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-03-03
  • ubunt18.04LTS+vscode+anaconda3下的python+C++調(diào)試方法

    ubunt18.04LTS+vscode+anaconda3下的python+C++調(diào)試方法

    這篇文章主要介紹了ubunt18.04LTS+vscode+anaconda3下的python+C++調(diào)試方法,本文給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Qt寫入Json文件的方法詳解(含源碼+注釋)

    Qt寫入Json文件的方法詳解(含源碼+注釋)

    在Qt庫中,為JSON的相關(guān)操作提供了完整的類支持,下面這篇文章主要給大家介紹了關(guān)于Qt寫入Json文件(含源碼+注釋)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • C++ new、delete(new[]、delete[])操作符重載需要注意的問題

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

    這篇文章主要介紹了C++ new、delete(new[]、delete[])操作符重載需要注意的問題,本文同時講解了兼容默認的 new、delete 的錯誤處理方式、多態(tài)的問題等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • C語言逆向分析語法超詳細分析

    C語言逆向分析語法超詳細分析

    這篇文章主要介紹了C語言逆向分析語法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習吧
    2022-11-11
  • visual?studio?2022一個不易發(fā)現(xiàn)的問題

    visual?studio?2022一個不易發(fā)現(xiàn)的問題

    本文主要介紹了visual?studio?2022一個不易發(fā)現(xiàn)的問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2022-07-07

最新評論

乌审旗| 兴安县| 大宁县| 休宁县| 西华县| 新沂市| 金塔县| 繁峙县| 龙江县| 和龙市| 绵竹市| 威远县| 镇平县| 万载县| 法库县| 隆林| 眉山市| 莱阳市| 建平县| 宜良县| 房山区| 拉萨市| 崇左市| 嘉兴市| 双桥区| 家居| 赫章县| 当涂县| 奎屯市| 韶关市| 敦煌市| 大同县| 芜湖县| 雅安市| 绿春县| 永和县| 和田市| 滨州市| 枝江市| 嘉禾县| 榕江县|