摘要:的理解和區(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ī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é) |
用戶自定義的類型,例如:我們學(xué)過的結(jié)構(gòu)體類型。
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ù)(而非整型)。
整型家族包括一下類型:
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
浮點(diǎn)數(shù)家族包含兩類,均是小數(shù)(浮點(diǎn)數(shù)沒有signed 和unsigned區(qū)分)
float - - - 單精度浮點(diǎn)型(4字節(jié))
double - - - 雙精度浮點(diǎn)型(8字節(jié),精度更高)
整型和浮點(diǎn)型屬于內(nèi)置類型:
構(gòu)造類型屬于自定義類型。
構(gòu)造類型包含:
注:數(shù)組的元素類型和元素個(gè)數(shù)不一樣,則數(shù)組類型也會(huì)發(fā)生變化。(比如:int [10]與int [5]元素個(gè)數(shù)不一樣)所以數(shù)組類型也是自定義類型(自己構(gòu)造的類型)
指針類型有:
指針類型的使用以及意義,我們?cè)趯W(xué)習(xí)初階指針時(shí),詳細(xì)講過:忘記的同學(xué)可以點(diǎn)擊去查看:
【C語言初階】初始指針
void 表示空類型(無類型)
通常應(yīng)用于函數(shù)的返回類型、函數(shù)的參數(shù)、指針類型。
例如:
我們現(xiàn)在可以知道一個(gè)變量的創(chuàng)建是要在內(nèi)存中開辟空間的??臻g的大小是根據(jù)不同的類型而決定的。
那接下來我們來學(xué)習(xí)數(shù)據(jù)在所開辟的內(nèi)存空間時(shí)如何存儲(chǔ)的。
源碼、反碼、補(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)看下面例子:
對(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
首先請(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)存的高地址中;
這是因?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處理器還可以由硬件來選擇是大端模式還是小端模式。
請(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;}
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)。
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可以表示成下面的形式:
例如:
十進(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
摘要:在符號(hào)位中,表示正,表示負(fù)。我們知道對(duì)于整型來說,內(nèi)存中存放的是該數(shù)的補(bǔ)碼。在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來表示和存儲(chǔ)。表示有效數(shù)字,。規(guī)定對(duì)于位的浮點(diǎn)數(shù),最高的位是 ...
摘要:還不清楚原碼反碼補(bǔ)碼的可以到語言從入門到入土操作符篇中的移位操作符處學(xué)習(xí)一下。比如原碼反碼補(bǔ)碼原碼顯示值補(bǔ)碼數(shù)據(jù)存放內(nèi)存中其實(shí)存放的是補(bǔ)碼補(bǔ)碼的表示與存儲(chǔ)在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來表示和存儲(chǔ)。 ...
摘要:大多數(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...
閱讀 1307·2021-11-16 11:44
閱讀 3774·2021-10-09 10:01
閱讀 1769·2021-09-24 10:31
閱讀 3858·2021-09-04 16:41
閱讀 2528·2021-08-09 13:45
閱讀 1226·2019-08-30 14:08
閱讀 1791·2019-08-29 18:32
閱讀 1652·2019-08-26 12:12