成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【C語言進(jìn)階學(xué)習(xí)】一、數(shù)據(jù)的存儲(chǔ) (深度剖析數(shù)據(jù)在內(nèi)存中的存儲(chǔ))

AprilJ / 3857人閱讀

摘要:的理解和區(qū)別代表有符號(hào),整數(shù)在內(nèi)存中存儲(chǔ)的二進(jìn)制位的最高位為符號(hào)位,表示負(fù)數(shù),表示正數(shù)。那接下來我們來學(xué)習(xí)數(shù)據(jù)在所開辟的內(nèi)存空間時(shí)如何存儲(chǔ)的。請(qǐng)看下面例子為什么內(nèi)存中存儲(chǔ)的是補(bǔ)碼對(duì)于整數(shù)來說數(shù)據(jù)存放內(nèi)存中其實(shí)存放的是補(bǔ)碼。


一、數(shù)據(jù)類型介紹

1、內(nèi)置類型

其實(shí)我們已經(jīng)學(xué)過了基本的內(nèi)置類型,如下:

類型說明長(zhǎng)度
char字符型1個(gè)字節(jié)
short短整型2個(gè)字節(jié)
int整型4個(gè)字節(jié)
long長(zhǎng)整型4個(gè)字節(jié)
long long長(zhǎng)長(zhǎng)整型8個(gè)字節(jié)
float單精度浮點(diǎn)型4個(gè)字節(jié)
double雙精度浮點(diǎn)型8個(gè)字節(jié)

2、自定義類型

用戶自定義的類型,例如:我們學(xué)過的結(jié)構(gòu)體類型。

3、類型的意義

1.使用這個(gè)類型開辟內(nèi)存空間的大?。ù笮Q定了使用范圍)
比如說使用char類型創(chuàng)建的變量,開辟的內(nèi)存空間是1個(gè)字節(jié),而使用int類型創(chuàng)建的變量,開辟的內(nèi)存空間是4個(gè)字節(jié)。
2.如何看待看待內(nèi)存空間的視角
比如我們創(chuàng)建以下變量:

int a = 10;
float f = 10.0f;

這里的a和f所占內(nèi)存大小都是4個(gè)字節(jié),但是我們?cè)诳创齛的時(shí)候,因?yàn)閍的類型是int,所以我們會(huì)把a(bǔ)看做整型,而在看待f的時(shí)候,因?yàn)閒的類型是float,所以我們會(huì)把b看做浮點(diǎn)數(shù)(而非整型)。


二、類型的基本歸類

1、整型家族

整型家族包括一下類型:

unsigned (無符號(hào)) signed(有符號(hào))

我們?cè)诰帉懘a聲明變量時(shí),[int] 可以省略不寫,例如:
unsigned short a = 0;或者 unsigend short int a = 0;兩種寫法等價(jià)。

注意:char也算到整型家族里面,因?yàn)樽址诖鎯?chǔ)的時(shí)候,存儲(chǔ)的是字符所對(duì)應(yīng)的ASCII值(整數(shù)),例如:字符 ‘a(chǎn)’ 對(duì)應(yīng)的ASCII值為97。

unsigned / signed的理解和區(qū)別:
signed代表有符號(hào),整數(shù)在內(nèi)存中存儲(chǔ)的二進(jìn)制位的最高位為符號(hào)位,1表示負(fù)數(shù),0表示正數(shù)。

unsigned代表無符號(hào),均為正數(shù),最高位是有效位,不為符號(hào)位。

例如char類型,一個(gè)char是一個(gè)字節(jié) = 8bit,假如一個(gè)整數(shù)內(nèi)存中存放的二進(jìn)制的補(bǔ)碼為11111111, 如果是signed char,則最高位1是符號(hào)位,表示 - 1,如果是unsigned char,則最高位是有效位,不為符號(hào)位,它的值是一個(gè)正數(shù)255。

unsigned char與signed char兩者的取值范圍:

通過同樣的方法,我們也可以推算出其他類型的取值范圍。

注:char的類型到底是unsigned char還是signed char是不確定的,取決于編譯器。 (大部分編譯器下,char是 signed char)

其他類型(short、int、long)默認(rèn)都是有符號(hào)的(signed)。
short == signed short
int == signed int
long == signed long
如果要定義成無符號(hào)的,則必須自己聲明出來,例如:
unsigned short
unsigned int
unsigned long


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

浮點(diǎn)數(shù)家族包含兩類,均是小數(shù)(浮點(diǎn)數(shù)沒有signed 和unsigned區(qū)分)
float - - - 單精度浮點(diǎn)型(4字節(jié))
double - - - 雙精度浮點(diǎn)型(8字節(jié),精度更高)

整型和浮點(diǎn)型屬于內(nèi)置類型:


3、構(gòu)造類型

構(gòu)造類型屬于自定義類型。

構(gòu)造類型包含:

注:數(shù)組的元素類型和元素個(gè)數(shù)不一樣,則數(shù)組類型也會(huì)發(fā)生變化。(比如:int [10]與int [5]元素個(gè)數(shù)不一樣)所以數(shù)組類型也是自定義類型(自己構(gòu)造的類型)


4、指針類型

指針類型有:

指針類型的使用以及意義,我們?cè)趯W(xué)習(xí)初階指針時(shí),詳細(xì)講過:忘記的同學(xué)可以點(diǎn)擊去查看:
【C語言初階】初始指針


5、空類型

void 表示空類型(無類型)
通常應(yīng)用于函數(shù)的返回類型、函數(shù)的參數(shù)、指針類型。
例如:


三、整型在內(nèi)存中的存儲(chǔ)

我們現(xiàn)在可以知道一個(gè)變量的創(chuàng)建是要在內(nèi)存中開辟空間的??臻g的大小是根據(jù)不同的類型而決定的。
那接下來我們來學(xué)習(xí)數(shù)據(jù)在所開辟的內(nèi)存空間時(shí)如何存儲(chǔ)的。

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

源碼、反碼、補(bǔ)碼的概念我們?cè)谥v位操作符和移位操作符時(shí),已經(jīng)提到過,現(xiàn)在我們?cè)谶@在進(jìn)行詳細(xì)的講解。

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

舉例:如圖

解析:
對(duì)于正整數(shù):正整數(shù)的源碼、反碼、補(bǔ)碼相同。

對(duì)于負(fù)整數(shù)
源碼:
直接將數(shù)字按照正負(fù)數(shù)的形式翻譯成二進(jìn)制就可以。
反碼:
將原碼的符號(hào)位不變,其他位依次按位取反就可以得到了。
補(bǔ)碼:
反碼+1就得到補(bǔ)碼。

請(qǐng)看下面例子:

2、為什么內(nèi)存中存儲(chǔ)的是補(bǔ)碼

對(duì)于整數(shù)來說:數(shù)據(jù)存放內(nèi)存中其實(shí)存放的是補(bǔ)碼。
為什么呢?
我們首先看一下1-1這個(gè)例子:

①先按照原碼的方式去計(jì)算:

②接下來用補(bǔ)碼來進(jìn)行計(jì)算:

在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來表示和存儲(chǔ)。原因在于,使用補(bǔ)碼,可以將符號(hào)位和數(shù)值位統(tǒng)一處理;
同時(shí),加法和減法也可以統(tǒng)一處理(CPU只有加法器)此外,補(bǔ)碼與原碼相互轉(zhuǎn)換,其運(yùn)算過程是相同的,不需要額外的硬件電路。


怎么理解補(bǔ)碼與原碼相互轉(zhuǎn)換,其運(yùn)算過程是相同的?(以下運(yùn)算,符號(hào)位均不變)
原碼->取反 + 1->補(bǔ)碼
補(bǔ)碼->取反 + 1->原碼

根據(jù)我們講過的
原碼通過符號(hào)位不變其他位按位取反得到反碼,然后反碼+1得到補(bǔ)碼(原碼->取反 + 1->補(bǔ)碼)
反過來,我們想通過補(bǔ)碼得到源碼,則只需:
補(bǔ)碼減一得到反碼,然后反碼的符號(hào)位不變,其他位按位取反得到源碼(補(bǔ)碼 -> - 1 取反->原碼)

那么,我們還有一種方法可以通過補(bǔ)碼得到源碼:
首先補(bǔ)碼的符號(hào)位不變,其他位按位取反得到反碼,然后反碼+1得到源碼(補(bǔ)碼->取反 + 1->原碼)

例如 - 1:
11111111 11111111 11111111 11111111 - 補(bǔ)碼
補(bǔ)碼->取反 + 1->原碼
10000000 00000000 00000000 00000000 - 取反
10000000 00000000 00000000 00000001 - +1
補(bǔ)碼 -> - 1 取反->原碼
11111111 11111111 11111111 11111110 - -1
10000000 00000000 00000000 00000001 - 取反
最終得到的結(jié)果均是:10000000 00000000 00000000 00000001


四、大小端介紹

1、什么是大端小端

首先請(qǐng)看下面調(diào)試情況:

我們a輸入的16進(jìn)制形式是11223344,在內(nèi)存中存儲(chǔ)的時(shí)候卻是44332211,可以發(fā)現(xiàn)是倒著存儲(chǔ)的,而且是以字節(jié)為單位存儲(chǔ)的,地址是從左往右依次遞增的。

其實(shí)數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式可以分兩種,如圖:

總結(jié):
大端字節(jié)序存儲(chǔ):是指把一個(gè)數(shù)字的低位字節(jié)的內(nèi)容存放在內(nèi)存的高地址中,把高位字節(jié)的內(nèi)容,存放在內(nèi)存的低地址中;
小端字節(jié)序存儲(chǔ):是指把一個(gè)數(shù)字的低位字節(jié)的內(nèi)容存放在內(nèi)存的低地址中,把高位字節(jié)的內(nèi)容,存放在內(nèi)存的高地址中;


2、為什么有大端小端

這是因?yàn)樵谟?jì)算機(jī)系統(tǒng)中,我們是以字節(jié)為單位的,每個(gè)地址單元都對(duì)應(yīng)著一個(gè)字節(jié),一個(gè)字節(jié)為8bit。
但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器)。
另外,對(duì)于位數(shù)大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個(gè)字節(jié),那么必然存在著一個(gè)如果將多個(gè)字節(jié)安排的問題。
因此就導(dǎo)致了大端存儲(chǔ)模式和小端存儲(chǔ)模式。
例如一個(gè)16bit的short型x,在內(nèi)存中的地址為ox0010),x的值為0×1122,那么0x11為高字節(jié),0x22為低字節(jié)。對(duì)于大端模式,就將0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,剛好相反
我們常用的x86結(jié)構(gòu)是小端模式,而KEIL c51則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬件來選擇是大端模式還是小端模式。

3、面試題

請(qǐng)簡(jiǎn)述大端字節(jié)序和小端字節(jié)序的概念,設(shè)計(jì)一個(gè)小程序來判斷當(dāng)前機(jī)器的字節(jié)序。
解答:
大端字節(jié)序存儲(chǔ):是指把一個(gè)數(shù)字的低位字節(jié)的內(nèi)容存放在內(nèi)存的高地址中,把高位字節(jié)的內(nèi)容,存放在內(nèi)存的低地址中;

小端字節(jié)序存儲(chǔ):是指把一個(gè)數(shù)字的低位字節(jié)的內(nèi)容存放在內(nèi)存的低地址中,把高位字節(jié)的內(nèi)容,存放在內(nèi)存的高地址中;

如何判斷大端、小端(字節(jié)序)呢?
思路:
假如我們利用 int a = 1;來判斷當(dāng)前機(jī)器的字節(jié)序.
a = 1,用16進(jìn)制顯示是 0x 00 00 01,則:

大端字節(jié)序存儲(chǔ)形式為:00 00 01
大端字節(jié)序存儲(chǔ)形式為:01 00 00

所以只需將a的第一個(gè)字節(jié)內(nèi)容拿出來,判斷其是1還是0,1為小端,0為大端。

代碼實(shí)現(xiàn):

#include int main(){	int a = 1;	//0x 00 00 01 --- 16進(jìn)制顯示	//小端:01 00 00	//大端:00 00 01	char* p = (char*)&a;	if (*p == 1)	{		printf("小端/n");	}	else	{		printf("大端/n");	}	return 0;}

我們將判斷大小端的功能封裝成函數(shù)形式:

int check_sys(){	int a = 1;	//0x 00 00 01 --- 16進(jìn)制顯示	//小端:01 00 00	//大端:00 00 01	char* p = (char*)&a;	if(*p == 1)		return 1;	else		return 0;}int main(){	//如果是大端,返回0	//如果是小端,返回1	int ret = check_sys();	if (1 == ret)	{		printf("小端/n");	}	else	{		printf("大端/n");	}	return 0;}

我們可以對(duì)這個(gè)函數(shù)進(jìn)行優(yōu)化:

int check_sys(){	int a = 1;	char* p = (char*)&a;	return *p;}

再繼續(xù)優(yōu)化:

int check_sys(){	int a = 1;	return *(char*)&a;}

五、練習(xí)

1~7道練習(xí)判斷輸出為何

1、下面這段代碼的結(jié)果是什么?

#include int main(){	char a = -1;	signed char b = -1;	unsigned char c = -1;	printf("a=%d,b=%d,c=%d", a, b, c);	return 0;}

運(yùn)行結(jié)果:

代碼分析:

2、下面這段代碼的結(jié)果是什么?

#include int main(){    char a = -128;    printf("%u/n",a);    return 0; }

運(yùn)行結(jié)果:

代碼分析:

3、下面這段代碼的結(jié)果是什么?

#include int main(){    char a = 128;    printf("%u/n",a);    return 0; }

運(yùn)行結(jié)果:

代碼分析:


4、下面這段代碼的結(jié)果是什么?

#include int main(){	int i = -20;	unsigned int j = 10;	printf("%d/n", i + j);	return 0;}

運(yùn)行結(jié)果:

代碼分析:

5、下面這段代碼的結(jié)果是什么?

#include int main(){	unsigned int i;	for (i = 9; i >= 0; i--) 	{		printf("%u/n", i);	}	return 0;}

運(yùn)行結(jié)果:死循環(huán)

為了能更好的觀察到代碼細(xì)節(jié)的變化,我們加上Sleep(1000),每打印一個(gè)數(shù)據(jù)都暫停1000ms = 1s。

#include #include int main(){	unsigned int i;	for (i = 9; i >= 0; i--) 	{		printf("%u/n", i);		Sleep(1000);	}	return 0;}


代碼分析:
為什么會(huì)發(fā)生死循環(huán)呢?

unsigned int i
i為無符號(hào)整型,恒>=0,循環(huán)語句的判斷條件恒成立。

當(dāng) i一直減到-1時(shí),存放入unsigned int i 中會(huì)變?yōu)闊o符號(hào)整型,變?yōu)橐粋€(gè)非常大的正數(shù)。

6、下面這段代碼的結(jié)果是什么?

#include #include int main(){	char a[1000];	int i;	for (i = 0; i<1000; i++)	{		a[i] = -1 - i;	}	printf("%d", strlen(a));	return 0;}

運(yùn)行結(jié)果:

代碼分析:
我們利用strlen函數(shù)求字符數(shù)組a的字符串長(zhǎng)度,意思就是求在 ‘/0’ ,之前字符的個(gè)數(shù)。而 ‘/0’ 的ASCII碼值為0 。所以就是求0之前的字符個(gè)數(shù)。

我們?cè)谏戏街v到,char類型的取值范圍為 - 128 — 127,如圖:

我們可以發(fā)現(xiàn)這么一個(gè)規(guī)律,當(dāng)我們從上往下依次加1,當(dāng)加到127時(shí),再加1就變成-128,當(dāng)我們繼續(xù)加1,直到-1時(shí),再加1,就會(huì)發(fā)現(xiàn),值又變回0,所以這可以看成是一個(gè)循環(huán)。請(qǐng)看下面這幅圖,更方便理解:

我們可以看出,代碼是每次減1進(jìn)行賦值,所以:arr[0] = -1, 從 - 1 —> 0要經(jīng)過 - 1, - 2, - 3,…… - 128, 127, 126……3, 2, 1, 0…
128 + 127 = 255個(gè)數(shù)字,將最后一位的/0排除(strlen在計(jì)算字符串長(zhǎng)度的時(shí)候,遇到/0停止且不計(jì)算/0的長(zhǎng)度),所以最后的結(jié)果是255。

7、下面這段代碼的結(jié)果是什么?

#include unsigned char i = 0;int main(){	for (i = 0; i <= 255; i++)	{		printf("hello world/n");	}	return 0;}

運(yùn)行結(jié)果:和第五題問題的原理相似,死循環(huán)打印Hello world

分析:
因?yàn)?,unsigned char 的取值范圍是 0~255,如圖:

當(dāng)我們 i 自增到255時(shí),再加1,就會(huì)發(fā)生截?cái)?,值又變?了。
所以條件判斷部分恒<=255,從而造成死循環(huán)。

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

1、浮點(diǎn)型數(shù)據(jù)基礎(chǔ)知識(shí)
常見的浮點(diǎn)數(shù):3.14159,1E10(1.0 x 10^10)
浮點(diǎn)數(shù)家族包括:float、double、long double類型
浮點(diǎn)數(shù)表示的范圍 : float.h中定義
整型家族表示的范圍:limits.h中定義

2、如何查看float.h和limits.h呢?
查看limits.h文件方法:


這里就是所有整型家族表示的范圍。

查看float.h文件方法:

我們可以先找到VS2019安裝的最外層文件夾,在該文件下搜索float.h
找到對(duì)應(yīng)文件后,可以將文件拖進(jìn)VS2019打開查看



3、舉例
下面通過一個(gè)例子,來了解浮點(diǎn)型再內(nèi)存中的存儲(chǔ)

#include 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;}

運(yùn)行結(jié)果:

num 和 *pFloat 在內(nèi)存中明明是同一個(gè)數(shù),為什么浮點(diǎn)數(shù)和整數(shù)的解讀結(jié)果會(huì)差別這么大?

浮點(diǎn)數(shù)存儲(chǔ)規(guī)則
根據(jù)國(guó)際標(biāo)準(zhǔn)IEEE(電氣和電子工程協(xié)會(huì)) 754,任意一個(gè)二進(jìn)制浮點(diǎn)數(shù)V可以表示成下面的形式:

  • (-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ù)位。

例如:
十進(jìn)制的5.5,寫成二進(jìn)制是101.1
為什么5.5,寫成二進(jìn)制是101.1,而不是101.101呢?如圖:


因?yàn)?01.1小數(shù)點(diǎn)后面的1數(shù)表示2^-1,即1/2。以此類推,越往后,就分別表示:2 ^ -2,2 ^ -3…

所以5.5的二進(jìn)制利用科學(xué)計(jì)數(shù)法可以寫為:1.011*2^2。對(duì)應(yīng)上面的公式則表示為:
(-1) ^ 0 * 1.011 *2^2
可以得出:
S = 0
M = 1.011
E = 2

再比如:
十進(jìn)制的9.0,寫成二進(jìn)制是1001.0,利用科學(xué)計(jì)數(shù)法可以寫為 :1.001*2^3
對(duì)應(yīng)上面的公式則表示為:(-1) ^ 0 * 1.001 *2^3
可以得出:
S = 0
M = 1.001
E = 3


IEEE754規(guī)定:

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

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

了解了這些之后,那M和E具體是如何存儲(chǔ)的呢?

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

前面說過, 1≤M<2 ,也就是說,M可以寫成 1.xxxxxx 的形式,其中xxxxxx表示小數(shù)部分。

IEEE754規(guī)定,在計(jì)算機(jī)內(nèi)部保存M時(shí),默認(rèn)這個(gè)數(shù)的第一位總是1,因此可以被舍去,只保存后面的xxxxxx部分。
比如保存1.01的時(shí)候,只保存01,等到讀取的時(shí)候,再把第一位的1加上去。這樣做的目的,是節(jié)省1位有效數(shù)字。
以32位浮點(diǎn)數(shù)為例,留給M只有23位,將第一位的1舍去以后,等于可以保存24位有效數(shù)字

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

首先,E為一個(gè)無符號(hào)整數(shù)(unsigned int)

這意味著,如果E為8位,它的取值范圍為0 ~ 255;如果E為11位,它的取值范圍為0~2047。但是,我們知道,科學(xué)計(jì)數(shù)法中的E是可以出現(xiàn)負(fù)數(shù)的,所以IEEE754規(guī)定,存入內(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

然后,指數(shù)E從內(nèi)存中取出還可以再分成三種情況:

E不全為0或不全為1

這時(shí),浮點(diǎn)數(shù)就采用下面的規(guī)則表示,即指數(shù)E的計(jì)算值減去127(或1023),得到真實(shí)值,再將有效數(shù)字M前 加上第一位的1。 比如:
0.5(1/2)的二進(jìn)制形式為0.1,由于規(guī)定正數(shù)部分必須為1,即將小數(shù)點(diǎn)右移1位, 則為1.0*2^(-1),其階碼為-1+127=126,表示為01111110,而尾數(shù)1.0去掉整數(shù)部分為0,補(bǔ)齊0到23位00000000000000000000000,則其二進(jìn)制表示形式為
0 01111110 00000000000000000000000

E全為0

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

E全為1

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

關(guān)于浮點(diǎn)數(shù)的表示規(guī)則就這么多。

了解以上規(guī)則之后,請(qǐng)看下面例子,觀察浮點(diǎn)數(shù)的存儲(chǔ):

#include int main(){	float f = 5.5f;//不加f,編譯器默認(rèn)存儲(chǔ)double類型	//101.1  --- 二進(jìn)制表示形式	//(-1)^0 * 1.011 * 2^2	//S=0	//M=1.011	//E=2   +127 存儲(chǔ)(129)	//0 10000001 01100000000000000000000	//S    E            M	//0100 0000 1011 0000 0000 0000 0000 0000	//40 B0 00 00 --- 以16進(jìn)制存儲(chǔ)	//我們可以按F10調(diào)試查看內(nèi)存	return 0;}


可以直觀看出,在內(nèi)存中存儲(chǔ)的結(jié)果與我們運(yùn)算的結(jié)果一致,這里倒著存儲(chǔ),是因?yàn)樾《俗止?jié)序存儲(chǔ)方式。

解析上方例題:

#include int main(){	int n = 9;	00000000000000000000000000001001	float *pFloat = (float *)&n;	//*pFloat---是以浮點(diǎn)數(shù)的視角去訪問n的四個(gè)字節(jié),就會(huì)認(rèn)為n的4個(gè)字節(jié)中放的是浮點(diǎn)數(shù),所以n以浮點(diǎn)數(shù)存儲(chǔ)的形式為:	//0 00000000 00000000000000000001001	//E為全0	//所以E直接就是 1-127 = -126	//M = 0.00000000000000000001001	//結(jié)果為:0.00000000000000000001001 * 2^-126 無窮小的數(shù)字	printf("n的值為:%d/n", n);//9	printf("*pFloat的值為:%f/n", *pFloat);//0.000000 打印結(jié)果小數(shù)點(diǎn)及其后六位(精度)	*pFloat = 9.0;	//*pFloat是以浮點(diǎn)數(shù)的視角觀察n的4個(gè)字節(jié)的	//所以以浮點(diǎn)數(shù)的形式存儲(chǔ)9.0	//1001.0 --- 9.0的二進(jìn)制表示形式	//(-1)^0 * 1.001*2^3	//S=0	//E = 3	//M = 1.001	//存儲(chǔ)結(jié)果:	//0 10000010 00100000000000000000000	printf("num的值為:%d/n", n);	//以有符號(hào)的形式打印整數(shù)	//將01000001000100000000000000000000看作一個(gè)有符號(hào)的整數(shù),所以它的源反補(bǔ)相同,打印結(jié)果為1091567616	printf("*pFloat的值為:%f/n", *pFloat);//以浮點(diǎn)型打印,所以值就為9.000000	return 0;}


好了,到此數(shù)據(jù)的存儲(chǔ)就講完了,希望大佬幫忙點(diǎn)評(píng)呀 ?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/119108.html

相關(guān)文章

  • C語言進(jìn)階問:數(shù)據(jù)內(nèi)存中是如何存儲(chǔ)?(手把手帶你深度剖析數(shù)據(jù)內(nèi)卒中存儲(chǔ),超全解析,碼住不

    摘要:在符號(hào)位中,表示正,表示負(fù)。我們知道對(duì)于整型來說,內(nèi)存中存放的是該數(shù)的補(bǔ)碼。在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來表示和存儲(chǔ)。表示有效數(shù)字,。規(guī)定對(duì)于位的浮點(diǎn)數(shù),最高的位是 ...

    ghnor 評(píng)論0 收藏0
  • C語言】從入門到入土(進(jìn)階數(shù)據(jù)存儲(chǔ)

    摘要:還不清楚原碼反碼補(bǔ)碼的可以到語言從入門到入土操作符篇中的移位操作符處學(xué)習(xí)一下。比如原碼反碼補(bǔ)碼原碼顯示值補(bǔ)碼數(shù)據(jù)存放內(nèi)存中其實(shí)存放的是補(bǔ)碼補(bǔ)碼的表示與存儲(chǔ)在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來表示和存儲(chǔ)。 ...

    mcterry 評(píng)論0 收藏0
  • Java開發(fā)

    摘要:大多數(shù)待遇豐厚的開發(fā)職位都要求開發(fā)者精通多線程技術(shù)并且有豐富的程序開發(fā)調(diào)試優(yōu)化經(jīng)驗(yàn),所以線程相關(guān)的問題在面試中經(jīng)常會(huì)被提到。將對(duì)象編碼為字節(jié)流稱之為序列化,反之將字節(jié)流重建成對(duì)象稱之為反序列化。 JVM 內(nèi)存溢出實(shí)例 - 實(shí)戰(zhàn) JVM(二) 介紹 JVM 內(nèi)存溢出產(chǎn)生情況分析 Java - 注解詳解 詳細(xì)介紹 Java 注解的使用,有利于學(xué)習(xí)編譯時(shí)注解 Java 程序員快速上手 Kot...

    LuDongWei 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<