日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【C语言进阶】从入门到入土(数据的存储)

發(fā)布時間:2024/3/26 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C语言进阶】从入门到入土(数据的存储) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言:
這一篇我們來深度剖析數(shù)據(jù)在內(nèi)存中的存儲,讓我們走進(jìn)數(shù)據(jù)在內(nèi)存中到底是任何進(jìn)行存儲的,不同的數(shù)據(jù)類型有何差異。

進(jìn)階之?dāng)?shù)據(jù)的存儲:

  • 一、數(shù)據(jù)類型詳細(xì)介紹及歸類
    • 1.數(shù)據(jù)類型介紹
    • 2.類型的基本歸類
      • ① 整形家族
      • ② 浮點(diǎn)數(shù)家族
      • ③ 構(gòu)造類型
      • ④ 指針類型
      • ⑤ 空類型
  • 二、整形在內(nèi)存中的存儲
    • 1.關(guān)于整形的大小范圍
    • 2.變量創(chuàng)建時的內(nèi)存空間
    • 3.原碼、反碼、補(bǔ)碼
    • 4.補(bǔ)碼的表示與存儲
  • 三、大小端字節(jié)序介紹及判斷
    • 1.大小端介紹
  • 四、浮點(diǎn)型在內(nèi)存中的存儲
    • 1.常見的浮點(diǎn)數(shù)及范圍
    • 2.整形與浮點(diǎn)型存儲方式
    • 3.浮點(diǎn)型在內(nèi)存中的存儲
    • 4.IEEE754的特別規(guī)定
    • 5.重新觀察代碼

一、數(shù)據(jù)類型詳細(xì)介紹及歸類

1.數(shù)據(jù)類型介紹

基本內(nèi)置類型(即為C語言本身具有的類型)

我們先前學(xué)到的這幾類基本類型:

數(shù)據(jù)類型說明
char字符數(shù)據(jù)類型
short短整型
int整形
long長整型
long long更長的整形
float單精度浮點(diǎn)數(shù)
double雙精度浮點(diǎn)數(shù)

ps:一些較為老的編譯器中沒有l(wèi)ong long類型。

類型的兩個重要意義:

  • 類型決定開辟內(nèi)存空間的大小(大小決定了使用范圍)。
  • 類型決定了看待內(nèi)存空間的視角。
  • 對于第一個意義,我們可以拆開來看待:

    1.這么多種類型又如何分類?

    我們可以歸類一下,因為char字符在底層存儲的時候是ASCII碼值,ASCII碼值為整數(shù),所有也算屬于整形。所以上面的char到long long 都屬于整形家族,float和double為浮點(diǎn)數(shù)家族。

    2.而為什么要有整形浮點(diǎn)型的劃分呢?

    因為我們生活中到處都是整數(shù)和小數(shù)。

    3.為什么要有如短整型長整形,單精度雙精度之分呢?

    這是因為我們在創(chuàng)建類型的內(nèi)存大小直接影響我們所能存儲的范圍大小,簡單來說就是能使用適當(dāng)?shù)目臻g去存儲適當(dāng)?shù)闹?#xff0c;不至于太大的空間浪費(fèi)或越界溢出。

    而第二個意義中,就是類似于同一種事務(wù)以不同的看法去看待它和對待它。

    比如下面代碼:

    int main() {int a = 10;float b = 10.0f;return 0; }

    在這里,a和b所創(chuàng)建的類型都是4個字節(jié),而不同的是類型,當(dāng)你用int類型創(chuàng)建的時候,a的創(chuàng)建,存取都是按照整形來操作;同理在創(chuàng)建b的時候,就是完全按照float類型來了。

    具體有什么不同,我們接著往下看就知道了。


    2.類型的基本歸類


    ① 整形家族

    ps:[ ]內(nèi)可省略,如 signed short int 可寫為signed short,或者short int 也可以寫為short。

    類型類別
    charunsigned char
    signed char
    shortunsigned short [int]
    signed short [int]
    intunsigned int
    signed int
    longunsigned long [int]
    signed long [int]

    我們可以看到在整形家族中,每個類型分為有無符號兩種,而一般我們在編譯過程中,定義一個整形的時候并沒有在前面寫有無符號,這時一般默認(rèn)為有符號。如:int a = 10;定義的a就是有符號的,short和long同樣適用。

    但char 在定義的時候,默認(rèn)符號取決于編譯器,大多數(shù)編譯器中char是有符號的char,即為signed char。

    即:

    #include <stdio.h>int main() {//有無符號?char a;//取決于編譯器short b;//等于 signed shortint c;//等于 signed intlong d;//等于 signed longreturn 0; }

    那么有符號和無符號有什么區(qū)別呢?

    我們知道,整數(shù)有原反補(bǔ)三種編碼方式,原碼為顯示數(shù)值的形式,補(bǔ)碼為在內(nèi)存中存儲的形式。

    有符號的原碼中,最高位為符號位,即0代表正號,1代表符號,其他位是有效(數(shù)值)位。而無符號的原碼中,全部為有效(數(shù)值)位。

    我們來看這一段代碼:

    int main() {unsigned char c1 = 255;signed char c2 = 255;char c3 = 255;printf("%d\n", c1);printf("%d\n", c2);printf("%d\n", c3);//三個輸出分別是多少?return 0; }

    答案是: 255 ,-1 , -1 。

    還不清楚原碼反碼補(bǔ)碼的可以到 【C語言】從入門到入土(操作符篇)中的移位操作符處學(xué)習(xí)一下。也可以先看下面也有介紹。

    當(dāng)我們將255儲存的時候,其原碼為11111111,因為正數(shù)原反補(bǔ)碼相同,所有在內(nèi)存中存儲的時候也是11111111。不清楚我們可以打開內(nèi)存中查看。在vs2019中 F10運(yùn)行起來,然后點(diǎn)擊調(diào)試——窗口——內(nèi)存——內(nèi)存1,然后輸入地址就可以看見了。

    這里是十六進(jìn)制顯示,一個f就是15,也就是二進(jìn)制中1111,兩個f所以就是11111111,證明我們的原碼是正確的。那這里為什么有255和-1兩個結(jié)果呢?答案就在符號位那里:

    int main() {unsigned char c1 = 255;signed char c2 = 255;char c3 = 255;//存進(jìn)去時,都是 11111111printf("%d\n", c1);//取c1的時候,c1無符號,都是有效位,值為255printf("%d\n", c2);//取c2的時候,c2有符號,第一位符號位,是負(fù)數(shù),需要算出原碼再得值//補(bǔ)碼11111111 反碼11111110 原碼10000001 所以c2= -1 printf("%d\n", c3);//與c2同理得-1return 0; }

    當(dāng)有符號和無符號存進(jìn)去的時候都是255,但取出來的時候就在判斷有無符號的時候產(chǎn)生了差異,這里既然同一個數(shù)存儲取出的時候有不同,那有無符號的范圍也是有所不同的。

    有符號char因為有負(fù)數(shù)域,所以范圍是 -128~127。
    無符號char因為無符號,所以范圍是0~255,沒有負(fù)數(shù)。

    而從char中,我們也可以延申計算出short,int,long等有無符號的范圍,這里就不一一計算了,有興趣的可以自己算一下。

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

    float

    double

    浮點(diǎn)型家族中有單精度浮點(diǎn)型和雙精度浮點(diǎn)型,什么時候用單精度什么時候用雙精度取決于你需要精度多高,你需要更高精度用double,不需要就用float,在float足夠用時用double的話會浪費(fèi)內(nèi)存空間。

    ③ 構(gòu)造類型

    構(gòu)造類型就是自己能夠創(chuàng)造的類型,自定義類型。

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

    1.數(shù)組也是有類型的。

    int main() {int a = 0;//整形類型int arr[10] = { 0 };//數(shù)組,arr為數(shù)組名//去掉數(shù)組名就是數(shù)組類型,在這里數(shù)組類型是intreturn 0; }

    我們可以驗證一下,當(dāng)我們創(chuàng)建類型后需要計算類型大小的時候,我們可以用變量名來進(jìn)行計算,也可以用類型來計算。

    int main() {int a = 0;int arr[10] = { 0 };printf("%d\n", sizeof(a));//4printf("%d\n", sizeof(int));//4printf("%d\n", sizeof(arr));//40printf("%d\n", sizeof(int [10]));//40//答案是一樣的,說明數(shù)組除去數(shù)組名就是數(shù)組類型return 0; }

    2.關(guān)于結(jié)構(gòu)體

    關(guān)于結(jié)構(gòu)體可以查看操作符篇中的詳解。

    【C語言】從入門到入土(操作符篇)

    3.枚舉類型

    枚舉類型定義的一般形式為:

    enum 枚舉名{ 枚舉值表 };

    在枚舉值表中應(yīng)羅列出所有可用值。這些值也稱為枚舉元素。

    4.聯(lián)合類型

    在后面的博客中再做詳解。

    ④ 指針類型

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

    指針也是有類型的。

    當(dāng)我們需要將一個變量的地址保存起來的時候,我們就需要用到指針,例如下面這段代碼中,p就把num的地址儲存了起來,p就是指針變量:

    int num = 10; p = &num;

    而指針的定義方式是: type + * ,如char * p;

    其實(shí): char* 類型的指針是為了存放 char 類型變量的地址。 short* 類型的指針是為了存放 short 類型變量的地址。 int* 類型的指針是為了存放int 類型變量的地址。

    而指針類型的意義就在于確定了該指針的類型,就決定了指針向前或者向后走一步有多大(距離)。

    ⑤ 空類型

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

    我們看下面兩段代碼:

    void fun() {printf("hello!"); } int main() {fun();fun(10086);//正常運(yùn)行,輸出hello!hello!return 0; } void fun(void) {printf("hello!"); } int main() {fun();fun(10086);//能運(yùn)行,但錯誤列表中提示錯誤,輸出hello!hello!return 0; }

    當(dāng)我們調(diào)用自定義函數(shù)時,我們不設(shè)傳參,但在主函數(shù)中有值傳過去,結(jié)果也是不影響的,因為fun函數(shù)根本沒有接收這個傳參,我們也可以直接在函數(shù)后寫上void拒絕接收。


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

    1.關(guān)于整形的大小范圍

    我們可以直接在vs2019中去輸入下列代碼,然后點(diǎn)擊INT_MAX,轉(zhuǎn)到定義,就可以查看int的最大值和最小值了,同時還可以看到其他整形的最大最小值。

    #include <limits.h> //整形限制大小頭文件 INT_MAX;

    2.變量創(chuàng)建時的內(nèi)存空間

    當(dāng)一個變量創(chuàng)建的時候是要在內(nèi)存中開辟空間的。空間的大小是根據(jù)不同的類型而決定的。

    那數(shù)據(jù)在空間中是任何開辟的呢?
    比如int a = -1,創(chuàng)建這個整形變量之后,內(nèi)存中會如何變化,我們來觀察觀察。

    這里我們創(chuàng)建了一個變量a,F10代碼走起來之后,我們點(diǎn)擊查看內(nèi)存中的變化,地址寫&a,我們會發(fā)現(xiàn)當(dāng)執(zhí)行完int a = -1后,&a處地址的值變成了ff ff ff ff,我們知道一個f就是4個1(十六進(jìn)制轉(zhuǎn)二進(jìn)制),那-1為什么會儲存中是8個f呢,這里就引進(jìn)數(shù)據(jù)在儲存是有原反補(bǔ)三種編碼方式了。

    3.原碼、反碼、補(bǔ)碼

    計算機(jī)中的有符號數(shù)有三種表示方法,即原碼、反碼和補(bǔ)碼。三種表示方法均有符號位和數(shù)值位兩部分,符號位都是用0表示“正”,用1表示“負(fù)”,而數(shù)值位三種表示方法各不相同。正數(shù)的原、反、補(bǔ)碼都相同,負(fù)數(shù)則按下面規(guī)則進(jìn)行運(yùn)算。

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

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

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

    比如:

    int main() {int a = -1;//原碼:1 0000000 00000000 00000000 00000001//反碼:1 1111111 11111111 11111111 11111110//補(bǔ)碼:1 1111111 11111111 11111111 11111111//原碼:顯示值//補(bǔ)碼:數(shù)據(jù)存放內(nèi)存中其實(shí)存放的是補(bǔ)碼return 0; }

    4.補(bǔ)碼的表示與存儲

    在計算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來表示和存儲。

    原因在于,使用補(bǔ)碼,可以將符號位和數(shù)值域統(tǒng)一處理; 同時,加法和減法也可以統(tǒng)一處理(CPU只有加法器)此外,補(bǔ)碼與原碼相互轉(zhuǎn)換,其運(yùn)算過程是相同的,不需要額外的硬件電路。

    單純理解可能有點(diǎn)困難,我們可以舉例理解:

    int main() {int a = 1;int b = -1;int c = a - b;//c是怎么計算的呢return 0;}

    由于CPU只有加法器,所以表示為1+(-1)。

    假設(shè)是用原碼計算(二進(jìn)制運(yùn)算):

    a:00000000 00000000 00000000 00000001
    b:10000000 00000000 00000000 00000001
    —————————————————————
    c:10000000 00000000 00000000 00000010

    結(jié)果為-2,但是1-1應(yīng)該等于0呀。

    用補(bǔ)碼計算:
    a:00000000 00000000 00000000 00000001
    b:11111111 11111111 11111111 11111111
    —————————————————————
    c:100000000 00000000 00000000 00000000
    最前面的1會舍棄,保留后面的0得:
    c:00000000 00000000 00000000 00000000

    結(jié)果為0,這才是正確的答案。

    所以說使用補(bǔ)碼,可以將符號位和數(shù)值域統(tǒng)一處理。

    而最后一句,補(bǔ)碼與原碼相互轉(zhuǎn)換,其運(yùn)算過程是相同的,不需要額外的硬件電路。就是說上面原碼轉(zhuǎn)反碼,反碼轉(zhuǎn)補(bǔ)碼的過程,還有倒回去也是成立的,不需要其他算法。

    之前我們認(rèn)識的原反補(bǔ)轉(zhuǎn)換:

    而這句話中的原反補(bǔ)轉(zhuǎn)換:

    也就是怎么從原碼轉(zhuǎn)換補(bǔ)碼,也可以以同樣的方式按順序從補(bǔ)碼轉(zhuǎn)換為原碼。

    我們再看看,數(shù)據(jù)存儲中有什么地方值得我們關(guān)注的,內(nèi)存中有什么秘密,我們看一下這張圖:

    圖中我們創(chuàng)建了兩個變量,一正一負(fù),然后我們算出a和b在存儲中的十六進(jìn)制表現(xiàn)形式,發(fā)現(xiàn)和內(nèi)存中倒了過來,我們明明得出a是00 00 00 ff,而在內(nèi)存中顯示為ff 00 00 00,這就涉及到大小段的概念了。


    三、大小端字節(jié)序介紹及判斷

    1.大小端介紹

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

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

    為什么會有大小端:

    因為在計算機(jī)系統(tǒng)中,我們是以字節(jié)為單位的,每個地址單元都對應(yīng)著一個字節(jié),一個字節(jié)為8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對于位數(shù)大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個字節(jié),那么必然存在著一個如果將多個字節(jié)安排的問題。因此就導(dǎo)致了大端存儲模式和小端存儲模式。

    例如一個 16bit 的 short 型 x ,在內(nèi)存中的地址為 0x0010 , x 的值為 0x1122 ,那么 0x11 為高字節(jié), 0x22為低字節(jié)。對于大端模式,就將 0x11 放在低地址中,即 0x0010 中, 0x22 放在高地址中,即 0x0011 中。小端模式,剛好相反。我們常用的 X86 結(jié)構(gòu)是小端模式,而 KEIL C51 則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬件來選擇是大端模式還是小端模式。

    我們來看一個更詳細(xì)的例子:

    0x表示以十六進(jìn)制表示值,這樣子我們就很直觀的看見。我們所存儲的變量,在內(nèi)存中恰恰反著存儲了過來。

    其實(shí),數(shù)據(jù)在內(nèi)存中存儲時,我們可以選擇千奇百怪的存儲方式,我們可以存進(jìn)去時為11 33 22 44 ,也可以是22 33 11 44,但是為了規(guī)整統(tǒng)一,存取方便,我們就把其他的都除去了,留下了大小端這兩種存儲方式。

    大小端圖示:

    其實(shí)大小端儲存模式就是牽扯到數(shù)據(jù)存儲到內(nèi)存時字節(jié)順序的一個問題,而我們當(dāng)前的vs2019就是小段字節(jié)序。


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

    1.常見的浮點(diǎn)數(shù)及范圍

    3.14159 ,1E10 (即為1.0乘以10的10次方),浮點(diǎn)數(shù)家族包括: float、double、long double 類型。

    ① 查看浮點(diǎn)數(shù)的大小范圍與整形的查看類似,float.h頭文件就是浮點(diǎn)數(shù)限制大小發(fā)文件。寫出下列代碼,然后點(diǎn)擊FLT_MAX,轉(zhuǎn)到定義,就可以查看了。

    #include <float.h> FLT_MAX;

    ②也可以在電腦中直接搜索float.h文件,然后把他拖到vs編譯器里面,也可以查看,直接用此電腦查看估計比較緩慢,這里推薦一個查找器everything(基于名稱快速定位文件和文件夾。)。

    Everything 下載鏈接

    快速查找定位文件和文件夾:

    2.整形與浮點(diǎn)型存儲方式

    整形與浮點(diǎn)型存儲方式是不是一樣的呢?

    我們可以用一個代碼來試驗一下就知道了,我們存一個整形以浮點(diǎn)型的形式取出,存浮點(diǎn)型以整形的形式取出,看看數(shù)值是否正確便知。

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

    結(jié)果是不一樣的!以整形存儲進(jìn)去浮點(diǎn)型拿出的9得到的是0.00000,而浮點(diǎn)型存進(jìn)去整形拿出的9.0竟然成了1091567616。

    所以我們要重新理解浮點(diǎn)型是如何存儲的。

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

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

    • (-1)^S * M * 2^E
    • (-1)^s表示符號位,當(dāng)s=0,V為正數(shù);當(dāng)s=1,V為負(fù)數(shù)。
    • M表示有效數(shù)字,大于等于1,小于2。
    • 2^E表示指數(shù)位。

    舉例來說:

    在這里,十進(jìn)制小數(shù)點(diǎn)前面的,均按照二進(jìn)制換算進(jìn)行,而小數(shù)點(diǎn)后面的,則不是直接換算,而是小數(shù)點(diǎn)后面每一位,對應(yīng)著2的負(fù)n次方的值,比如上面的5.5轉(zhuǎn)換后是101.1,小數(shù)點(diǎn)后面第一位表示的就是2的負(fù)一次方,即為0.5,小數(shù)點(diǎn)后面第二位就是0.25。但不要糾結(jié)如3.3的數(shù)字,這類數(shù)是比較難以保存的。

    同理,當(dāng)浮點(diǎn)數(shù)為負(fù)數(shù)的時候,s就是1,其他的不變。比如十進(jìn)制的-5.0,寫成二進(jìn)制是 -101.0 ,相當(dāng)于 -1.01×2^2 。那么,s=1,M=1.01,E=2。


    所以根據(jù)上述IEEE754規(guī)定,浮點(diǎn)數(shù)存儲的時候只需要存儲S,M,E三個數(shù)就可以了。

    而存儲時空間的分配:
    對于32位的浮點(diǎn)數(shù),最高的1位是符號位s,接著的8位是指數(shù)E,剩下的23位為有效數(shù)字M。

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

    4.IEEE754的特別規(guī)定

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

    ①有效數(shù)字M:

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

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

    也就是說,所有的浮點(diǎn)數(shù)都可以化為(-1)^S * M * 2^E這樣的形式,小數(shù)也不例外,比如0.5,化為0.1,也就是(-1)^0*1.0*2^(-1)。


    ②指數(shù)E:

    1.首先,E為一個無符號整數(shù)(unsigned int)
    這意味著,如果E為8位,它的取值范圍為0~255;如果E為11位,它的取值范圍為0~2047。但是我們上面的0.5轉(zhuǎn)換時就已經(jīng)發(fā)現(xiàn),E是有可能為負(fù)數(shù)的。所以IEEE754又規(guī)定了:

    存入內(nèi)存時E的真實(shí)值必須再加上一個中間數(shù),對于8位的E,這個中間數(shù)是127;對于11位的E,這個中間數(shù)是1023。比如,2^10的E是10,所以保存成32位浮點(diǎn)數(shù)時,必須保存成10+127=137,即10001001;而2^(-1)存進(jìn)去時,保存的便是-1+127=126,011111110。



    2.那存進(jìn)去的形式有了,取出的時候如何呢?

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

  • E不全為0或不全為1
  • 這時,浮點(diǎn)數(shù)就采用下面的規(guī)則表示,即指數(shù)E的計算值減去127(或1023),得到真實(shí)值,再將有效數(shù)字M前加上第一位的1,即為怎么存的就怎么取。

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

  • E全為1
  • 與E為全0一樣,當(dāng)E為全1的時候,是一個非常非常大的數(shù)字,再加上正負(fù)號,就類似接進(jìn)于正負(fù)無窮大。所以這時,如果有效數(shù)字M全為0,表示±無窮大(正負(fù)取決于符號位s)。

    5.重新觀察代碼

    知道了浮點(diǎn)數(shù)的存取,我們重新來打量一下這段代碼:

    int main() {int n = 9;//整形理解:00000000 00000000 00000000 00001001//浮點(diǎn)型理解:0 00000000 0000000000000000001001float* pFloat = (float*)&n;printf("n的值為:%d\n", n);//9printf("*pFloat的值為:%f\n", *pFloat);//0//所以按照上面的浮點(diǎn)型理解,E還要減去127,得出為//(-1)^0 * 1.001*2^(-126) 接近為 0,所以顯示為0.000000//默認(rèn)打印小數(shù)點(diǎn)后六位*pFloat = 9.0;printf("num的值為:%d\n", n);printf("*pFloat的值為:%f\n", *pFloat);return 0; }

    而下面那一段也是同樣的道理,按照浮點(diǎn)型存儲,9.0應(yīng)該存儲為1001.0
    所以為(-1)^0 * 1.001*2^3 ,而且E要加上127,然后轉(zhuǎn)化為二進(jìn)制數(shù)列就是

    浮點(diǎn)型理解:0 10000010 00100000000000000000000
    整形理解:01000001000100000000000000000000

    我們可以用計算機(jī)算一下:

    的確和程序運(yùn)行起來一樣的數(shù)字,所以證明上面的說法都是正確的。


    好啦,本篇的內(nèi)容就到這里,小白制作不易,有錯的地方還請xdm指正,互相關(guān)注,共同進(jìn)步。

    還有一件事:

    總結(jié)

    以上是生活随笔為你收集整理的【C语言进阶】从入门到入土(数据的存储)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。