溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C語言中數(shù)據(jù)類型有哪些

發(fā)布時(shí)間:2022-03-04 11:11:21 來源:億速云 閱讀:136 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“C語言中數(shù)據(jù)類型有哪些”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“C語言中數(shù)據(jù)類型有哪些”這篇文章吧。

    數(shù)據(jù)的存儲(chǔ)首先就要說到數(shù)據(jù)的類型,類型決定了看待內(nèi)存空間的視角。

    C語言的數(shù)據(jù)類型分為內(nèi)置類型和外置類型

    1.內(nèi)置類型

    (1)整型數(shù)組

    char(字符型)、short(短整型)、int(整型)、long(長整型)(signed 或者 unsigned

    (2)浮點(diǎn)型

    float(單精度浮點(diǎn)型)、double(雙精度浮點(diǎn)型)

    2.自定義類型

    (1)數(shù)組類型

    此處需要注意的是,去掉數(shù)組名就是數(shù)組的類型

    比如int arr[10],去掉數(shù)組名arr,int [10]就是數(shù)組數(shù)據(jù)類型

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

    (3)枚舉類型(enum

    (4)聯(lián)合類型(union

    C語言中數(shù)據(jù)類型有哪些

    3.指針類型

    4.空類型(void)

    數(shù)據(jù)的存儲(chǔ)形式就是以計(jì)算機(jī)的原碼反碼補(bǔ)碼進(jìn)行存儲(chǔ)的

    浮點(diǎn)型:不以原反補(bǔ)的形式進(jìn)行存儲(chǔ)

    其他的數(shù)字又分為有符號數(shù)和無符號數(shù)

    無符號數(shù):無符號數(shù)的原反補(bǔ)三種碼是一致的,存儲(chǔ)的時(shí)候沒有區(qū)別

    符號數(shù)來:正數(shù)的原反補(bǔ)碼是相同的,但是負(fù)數(shù)的原反補(bǔ)碼需要經(jīng)過運(yùn)算轉(zhuǎn)化(正數(shù)的最高位是0,負(fù)數(shù)的最高位是1)

    原碼:將二進(jìn)制按照正負(fù)數(shù)形式翻譯為二進(jìn)制數(shù)字

    反碼:將原碼的每一位取反

    補(bǔ)碼:反碼+1

    存儲(chǔ)的時(shí)候一般存儲(chǔ)數(shù)字的二進(jìn)制序列補(bǔ)碼

    同時(shí)數(shù)據(jù)的存儲(chǔ)存在大小端

    內(nèi)存空間具有編號,編號小的為低地址,編號大的為高地址

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

    小端存儲(chǔ):數(shù)據(jù)的低位保存在內(nèi)存的低地址中

    每個(gè)機(jī)器的存儲(chǔ)方式不同,可以用如下一段簡單代碼來觀察電腦是哪一種存儲(chǔ)方式

    #include<stdio.h>
    int main()
    {
    	int a = 1;
    	char* p = (char*)&a;
    //此處將整型地址強(qiáng)制轉(zhuǎn)化為字符型
    //強(qiáng)制轉(zhuǎn)化并不影響地址的存儲(chǔ),只會(huì)影響讀取
    //指針決定讀取內(nèi)存的位數(shù),字符型指針在解引用時(shí)只解1字節(jié),整型指針在解引用時(shí)解4字節(jié)
    //a存儲(chǔ)時(shí),a是正數(shù),原反補(bǔ)相同
    //00000000 00000000 00000000 00000001
    //指針在強(qiáng)制轉(zhuǎn)化為字符型之后只能讀取該內(nèi)存的前8位
    //如果該指針解引用后結(jié)果是1,該數(shù)據(jù)存儲(chǔ)結(jié)果為00000001 00000000 00000000 00000000
    //如果不是,該數(shù)據(jù)存儲(chǔ)結(jié)果為00000000 00000000 00000000 00000001
    	if (*p == 1)
    	{
    		printf("小端\n");
    	}
    	else
    	{
    		printf("大端\n");
    	}
    	return 0;
    }

    字符型

    char/signed char 所對應(yīng)的存儲(chǔ)區(qū)間為-128~127,同時(shí)規(guī)定10000000為-128。

    為了理解signed與unsigned,適用如下例題

    #include<stdio.h>
    int main()
    {
    	unsigned int i;
    	for (i = 9; i >= 0; i--)
    //在這個(gè)循環(huán)開始之前就需要注意到,i需要小于0,該循環(huán)才會(huì)停止
    //但是此時(shí)的i是一個(gè)unsigned類型,本身存儲(chǔ)的時(shí)候并沒有預(yù)留符號位,是沒有辦法破開循環(huán)的
    //該循環(huán)是死循環(huán)
    	{
    		printf("%d", i);
    	}
    }

    signedunsigned的區(qū)別就在于能否表示正負(fù)數(shù)

    在數(shù)據(jù)的存儲(chǔ)時(shí),是否存在符號位

    signed char與char類型的存儲(chǔ)也可以用一個(gè)圖來說明

    C語言中數(shù)據(jù)類型有哪些

    中間的分界線即為正負(fù)分界線,第一位即為符號位。符號位為1是負(fù)數(shù),符號位為0即為正數(shù)

    理解char的存儲(chǔ)范圍,借用如下例題

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	char a[1000];
    	int i;
    	for (i = 0; i < 1000; i++)
    	{
    		a[i] = -1 - i;
    	}
    	printf("%d", strlen(a));
    	return 0;
    }
    //i是int類型,可以隨著循環(huán)不斷增長,但是對于a這個(gè)數(shù)組來說,能存儲(chǔ)的數(shù)據(jù)有限。
    //數(shù)組a是字符型,字符型數(shù)組能存儲(chǔ)的范圍就是-128~127之間,一共255個(gè)數(shù),所以數(shù)組長度也是255

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

    int等類型的存儲(chǔ)方式與char相似,這里就不在多做贅述

    利用一個(gè)例子來證明浮點(diǎn)型存儲(chǔ)與整型存儲(chǔ)不同

    #include<stdio.h>
    int main()
    {
    	int n = 9;
    	float* pfloat = (float*)&n;
    	printf("n的值為:%d\n", n);
    	printf("*pfloat的值為:%f\n", *pfloat);
    //此處以單精度浮點(diǎn)型的指針取出存儲(chǔ)在整形中的數(shù)據(jù)
     
    	*pfloat = 9.0;
    	printf("n的值為:%d\n", n);
    	printf("*pfloat的值為:%f\n", *pfloat);
    //此處通過單精度浮點(diǎn)型的指針更改原本存儲(chǔ)在整型中的數(shù)字,并將其更改為單精度浮點(diǎn)型數(shù)字
    	return 0;
    }

    輸出結(jié)果:

    n的值為:9
    *pfloat的值為:0.000000
    n的值為:1091567616
    *pfloat的值為:9.000000

    由此可見,單精度浮點(diǎn)型的指針并不能成功取出原本存儲(chǔ)在整形中的數(shù)字,而第二步中通過單精度浮點(diǎn)型的指針?biāo)牡恼蔚闹?,n也無法成功取用,所打出來的數(shù)字并不是9。由此可見二者的存儲(chǔ)方式是存在較大差異的,所以下面對浮點(diǎn)型的存儲(chǔ)方式進(jìn)行講解。

    浮點(diǎn)型

    浮點(diǎn)型并不依靠數(shù)據(jù)的原反補(bǔ)碼進(jìn)行存儲(chǔ)

    浮點(diǎn)型有其特殊的規(guī)定

    C語言中數(shù)據(jù)類型有哪些

    (E也可以理解為最高此項(xiàng)所對應(yīng)的階次)

    用實(shí)例來證明一下

    比如8.5這個(gè)浮點(diǎn)數(shù)

    轉(zhuǎn)化為二進(jìn)制

    1000.1

    對于這個(gè)數(shù)而言,存儲(chǔ)成圖中形式就是

    (-1)^0*1.0001*2^3

    存儲(chǔ)就是

    0 00000011 00000000000000000010001

    此時(shí)假設(shè)我們所申請到的內(nèi)存是一個(gè)條狀,那么對于浮點(diǎn)數(shù)而言的數(shù)據(jù)存儲(chǔ)方式如圖所示

    C語言中數(shù)據(jù)類型有哪些

     C語言中數(shù)據(jù)類型有哪些

     單精度浮點(diǎn)型對應(yīng)的就是圖一中所示,SME分布在不同的位置,圖二的所示為雙精度浮點(diǎn)型,雙精度與單精度浮點(diǎn)型所對應(yīng)的E與M不同。

    (一)

    就是E的值,既不能全為0,也不能全為1,且E的存儲(chǔ)值與真實(shí)值不相同

    為了表示極小的小數(shù),比如1*10^-10,因?yàn)镋本身不具有符號位,所以不能表示負(fù)數(shù)

    單精度:E=真實(shí)值+127

    雙精度:E=真實(shí)值+1023

    加完之后再轉(zhuǎn)化為二進(jìn)制存儲(chǔ)為E,拿出來使用的時(shí)候再將這個(gè)數(shù)字減去

    特殊情況1:E為全0

    單精度的E此時(shí)的真實(shí)值為-127,該浮點(diǎn)數(shù)幾乎等于0,是一個(gè)幾乎不存在的數(shù)字

    特殊情況2:E為全1

    單精度的E此時(shí)的真實(shí)值為128,該浮點(diǎn)數(shù)是為正負(fù)無窮大的數(shù)字

    (二)

    對于M來說,M的值既然是在區(qū)間【1,2)之間,則位于整數(shù)部分的肯定為1

    再次利用單精度浮點(diǎn)型存儲(chǔ)8.5

    該數(shù)字的M為1.0001

    為了能讓浮點(diǎn)數(shù)表達(dá)更大的數(shù)字,且M中處于個(gè)位的數(shù)字固定為1,之后就規(guī)定,M中個(gè)位的1可以不再進(jìn)行存儲(chǔ),等到取用的時(shí)候再進(jìn)行添加。

    以上是“C語言中數(shù)據(jù)類型有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI